如果一个类中所有成员函数都是公用的,则可以在定义对象时对数据成员进行初始化:

class  Time

{

public:

hour;

minute;

sec;

};

Time t1={14,15,23};//将t1初始化为14:15:23

但是数据成员是私有的,或者类中有private或protected的成员,就不能用这种方法初始化。

构造函数:

构造函数是一种特殊的成员函数,用来处理对象的初始化,它不需要用户调用它,而是在建立对象时自动执行。构造函数的名子必须与类名同名,而不能由用户任    意命名,以便编译系统能够识别它并把它作为构造函数处理。它不具有任何类型,不返回任何值。构造函数的功能是由用户定义的,用户根据初始化的要求设计函数和函数参数。

#include <iostream>
using namespace std;
class Time
{
public:
Time()
{
hour=0;
minute=0;
sec=0;
}
void set_time();
void show_time();
private:
int hour;
int minute;
int sec;
};

void Time::set_time()
{
cin>>hour;
cin>>minute;
cin>>sec;
}

void Time::show_time()
{
cout<<hour<<":"<<minute<<":"<<sec<<endl;
}

int main()
{
Time t1,t2;
t1.set_time();
t1.show_time();
t2.set_time();
t2.show_time();
return 0;
}

在Time中定义了构造函数Time,它和所在的类同名,在建立对象时自动执行构造函数,它的作用是对该对象中的各数据成员赋初值0。记住,不要认为在声明时直接对程序数据成员赋初值。,这是错的,赋值语句只能写在构造函数体中,只有在调用构造函数时才执行这些赋值语句,对当前的对象中的数据成员赋值。

上面是在类内定义构造函数,也可以只在类内对构造函数进行声明而在类外定义构造函数。如

Time();

在类外定义构造函数:

Time::Time()

{

hour=0;

minute=0;

sec=0;

}

有关构造函数的说明:

1.什么时候开始使用构造函数?在类对象进入其作用域时开始调用构造函数。

2.构造函数没有返回值,因此也不需要在定义构造函数时声明类型,这是它和一般函数的一个重要的不同点。

3.构造函数不需要用户调用,也不需要被用户调用。构造函数在建立对象时由系统自动执行的,而且只执行一次。构造函数一般声明为public。

4.在构造函数的函数体中不仅可以对数据成员赋初值,而且可以包含其他语句,例如cout语句。但是一般不提倡在构造函数中加入与初始化无关的内容,以保        持程序的清晰。

5.如果用户自己没有定义构造函数,则C++系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也咩有参数,不执行初始化的操作。

带参数的构造函数。

由于有时用户需要对不同的对象赋予不同的初值,这时就就无法使用不含参数的构造函数实现了。

可以使用带参数的构造函数,在调用不同对象的构造函数时,从外面将不同的数据传递给构造函数,以实现不同的初始化,构造函数的一般格式:

构造函数名(类型1  形参1,类型2  形参2,类型3  形参3,....)

用户是不能调用构造函数的,因此无法采用常规的调用函数的方法给出实参(如fun(a,b)),实参是在定义对象时给出的,定义对象的一般格式为:

类名   对象名(实参名1,实参名2,....)

记住:带形参的构造函数主要目的就是为了使用不同的参数来得到不同的结果。实现对不同的对象进行不同的初始化。

使用参数初始化表对数据成员初始化

参数初始化表来实现对数据成员的初始化,这种方法不在函数体内对数据成员初始化,而是在函数首部实现。例如:

Box::Box(int h,int w,int len):height(h),width(w),length(len){}

即在原来函数首部的末尾加一个冒号,然后列出参数的初始化表。上面的初始化表表示:用形参h的值初始化数据成员height,用形参w初始化数据成员            width,用形参len的值初始化数据成员length。甚至可以直接在类体中定义函数。

构造函数的重载。

在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化的方法,供用户选用。这些构造函数具有相同的名字,而参数的个数或参数的类型不相        同。这称为构造函数的重载。

说明:

1.调用构造函数时不必给出实参的构造函数,称为默认构造函数,有些书中翻译为缺省构造函数。显然,无参数的构造函数属于默认的构造函数。一个类      中只可以有一个默认的构造函数。

2.如果在建立对象时选用的是无参数构造函数,应该注意正确书写定义对象的语句。

3.尽管在一个类中可以包含多个构造函数,但是对于每一个对象来说,建立对象时只执行其中的一个构造函数,并非每个构造函数都被执行。

使用默认的构造函数。

构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参去默认值。

#include <iostream>
using namespace std;
class Box
{
public:
Box(int h=10,int w=10,int len=15);
int volume();
private:
int height;
int width;
int length;
};

Box::Box(int h,int w,int len)
{
height=h;
width=w;
length=len;
}

int Box::volume()
{
return (height*width*length);
}

int main()
{
Box box1;
cout<<"the volume of box1 is"<<box1.volume()<<endl;
Box box2(15);
cout<<"the volume of box2 is"<<box2.volume()<<endl;
Box box3(15,30);
cout<<"the volume of box3 is"<<box3.volume()<<endl;
Box box4(15,30,20);
cout<<"the volume of box4 is"<<box4.volume()<<endl;
return 0;
}

说明:1.应该在什么地方指定构造函数的默认参数?应该在声明构造函数时指定默认值,而不能只在定义构造函数时指定默认值。因为类的声明时放在头文件中的,用户是可以看到的,而函数的定义是类的实现细节,用户是看不到的。

2.如果构造函数的全部参数都指定了默认值,则在定义对象时可以给出一个或几个实参,也可以不给出实参。

3.在一个类中定义了全部是默认参数的构造函数后,不能在定义重载构造函数。

关于类和对象的进一步讨论 C++的更多相关文章

  1. 关于类和对象的进一步讨论之析构函数 C++

    析构函数也是一个特殊的成员函数.它的作用与构造函数相反.它的名字是在类名的前面加一个“~”符号.在C++中“~”是位取反运算符.当对象的生命结束时,会自动执行解析函数.以下几种情况会执行析构函数: 1 ...

  2. oc语言学习之基础知识点介绍(二):类和对象的进一步介绍

    一.类.对象在内存中的存储 /* 内存分区: 栈:局部变量 堆:程序员自己写代码申请开辟的 程序员自己维护,编译器现在帮我们自动优化了,它在合适的给我们加上了释放空间的语句,所以我们现在写的对象不会造 ...

  3. 《Java从入门到失业》第四章:类和对象(4.3):一个完整的例子带你深入类和对象

    4.3一个完整的例子带你深入类和对象 到此为止,我们基本掌握了类和对象的基础知识,并且还学会了String类的基本使用,下面我想用一个实际的小例子,逐步来讨论类和对象的一些其他知识点. 4.3.1需求 ...

  4. 一文讲全了Python 类和对象内容

    摘要:这是一个关于 Python 类和对象的全部内容. 本文分享自华为云社区<从零开始学python | Python 类和对象-面向对象编程>,原文作者:Yuchuan  . Pytho ...

  5. Objective-C Runtime 运行时之一:类与对象

    Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一 ...

  6. 解析Java类和对象的初始化过程

    类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来 ...

  7. iOS RunTime运行时(1):类与对象

    Objective-C语言是一门动态语言,他将很多静态语言在编译和链接期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码更具有灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一下 ...

  8. 【译文】 C#面向对象的基本概念 (Basic C# OOP Concept) 第一部分(类,对象,变量,方法,访问修饰符)

    译文出处:http://www.codeproject.com/Articles/838365/Basic-Csharp-OOP-Concept 相关文档:http://files.cnblogs.c ...

  9. js之数组,对象,类数组对象

    许久不写了,实在是不知道写点什么,正好最近有个同事问了个问题,关于数组,对象和类数组的,仔细说起来都是基础,其实都没什么好讲的,不过看到还是有很多朋友有些迷糊,这里就简单对于定义以及一下相同点,不同点 ...

随机推荐

  1. layui 时间前后节点验证

    var start = { istime: true, format: 'YYYY-MM-DD hh:mm:ss', max: '2099-06-16', istoday: true, choose: ...

  2. (转)JavaScript深入之从原型到原型链

    构造函数创建对象 我们先使用构造函数创建一个对象: function Person() { } var person = new Person(); person.name = 'Kevin'; co ...

  3. android黑科技系列——修改锁屏密码和恶意锁机样本原理分析

    一.Android中加密算法 上一篇文章已经介绍了Android中系统锁屏密码算法原理,这里在来总结说一下: 第一种:输入密码算法 将输入的明文密码+设备的salt值,然后操作MD5和SHA1之后在转 ...

  4. node post和get请求原理

    重要:GET和POST请求他们都是上行请求,都是把数据从浏览器带向服务器的方式, GET 请求实际上就是识别URL中的querystring部分POST请求,一般用来发送大量的内容,此时node非常害 ...

  5. 基于 CC2530 的温度采集系统(未定稿)

    前言 最近在自学 Zigbee,每天的主要是任务是:看博客,看 CC2530 的 datasheet 和实践,熟悉片上的 SFR 以及控制板子. 学和做内容包括:IO.外部中断.Timer1/3/4. ...

  6. Deutsch lernen (12)

    1. hinweisen - wies hin - hingewiesen 向...指出,指明 auf etw.(A) hinweisen Ich möchte (Sie) darauf hiweis ...

  7. 【sqli-labs】 less11 POST - Error Based - Single quotes- String (基于错误的POST单引号字符型注入)

    查看源码,用户名和密码通过post提交 加单引号提交 出现报错,推测对应的SQL语句 , 直接使用or构造永真登录 成功,注意此处登录的用户为表中的第一个用户 需要改变用户可以通过改变筛选条件实现 作 ...

  8. js 获取属性名称,再根据这个属性名获取值

    if (result.success) { var obj = JSON.parse(result.data); var sltObj = document.getElementById(" ...

  9. 初探CORBA组件化编程

    1.掌握组件化开发的概念,了解CORBA模型及ORB机制:2.掌握CORBA组件编程方法.二.实验内容(一).步骤1.配制环境JDK环境.2.编写编译IDL接口.3.编写编译服务端程序.4.编写编译客 ...

  10. Linux思维导图之计划任务

    查漏补缺,理解概念,及时总结,互相交流,欢迎拍砖. 用yum install -y vixie-cron这个命令进行安装计划任务服务,可以在安装之前使用crontab -e进行检测一下,服务器是否安装 ...