CPP-Constructors
2015-09-20 00:14
204 查看
当declare一个普通变量时候,可以初始化,类却不允许这么做。例如:
当declare一个类的对象时候,此对象中所有数据成员是没有初始化的状态,直到用其他方式来初始化此对象。最简单的方式是用constructor来初始化一个类。constructor是一种特殊的初始化函数,此函数在每次一个类的变量被declare时候,或一个类的对象生成的时候自动调用。
constructors的声明(declarations)
有两个新添加行:
(constructor),构造函数和类同名。此处我们声明了两个构造函数,他们两个有同样的名字Clock. c++中有函数重载机制(同名函数,不同参数)。这也适用成员函数和构造函数。两个构造函数有不同的参数,因此他们被重载。
没有参数而被调用的构造函数叫默认构造函数(default constructor). 如果一个类的构造函数没有被定义,默认构造函数则被自动定义(此处有例外:程序将出现问题,如果类的数据成员是常数,引用或没有默认构造函数的类的类型。另外,一个类不允许有没有默认构造函数的基类)。
自动定义的默认构造函数被调用时,什么都不做。注意构造函数无返回值。
构造函数的定义
构造函数和成员函数定义类似,可以直接在类中定义,或分开单独定义。如果我们想在类中直接定义,则:
构造函数将三个数据成员h,m,s设置为零。如果我们倾向于不将构造函数的定义放在类的定义之中,则给出一个单独的构造函数定义:
第二个构造函数可以类似定义:
此处,成员变量从参数得到初始值。
另外一种赋值方式是在构造函数中采用初始化列表initialization list. 此表显示每一个数据成员的初始化值是多少:
h,m, s 被初始化为hour,min, sec. 注意一个函数定义必须要有函数体,因此在初始化列表后面必须有一对括号。
以上两种风格也可以混合使用:
构造函数中,采用何种初始化方法无所谓。但有时候必须用initialization list。例如,如果我们要初始化的数据成员是常数,或者引用。因为不允许给这种类型的数据赋值,所以必须用initialization list. 此外,initialization lists能生成更高效的代码,所以应该尽可能采用initialization list的方法。
class C{ int i=0; //ERROR, initialization forbidden const int k=0;//ERROR, initialization forbidden
当declare一个类的对象时候,此对象中所有数据成员是没有初始化的状态,直到用其他方式来初始化此对象。最简单的方式是用constructor来初始化一个类。constructor是一种特殊的初始化函数,此函数在每次一个类的变量被declare时候,或一个类的对象生成的时候自动调用。
constructors的声明(declarations)
class Clock { public: Clock (); Clock (int hour,int min,int sec); void set(int hour, int min, int sec); int read_hour() { return h; } int read_min() { return m; } int read_sec() { return s; } void write(bool write_sec = true); void tick(); private: int h, m, s; };
有两个新添加行:
Clock (); Clock (int hour,int min,int sec);
(constructor),构造函数和类同名。此处我们声明了两个构造函数,他们两个有同样的名字Clock. c++中有函数重载机制(同名函数,不同参数)。这也适用成员函数和构造函数。两个构造函数有不同的参数,因此他们被重载。
没有参数而被调用的构造函数叫默认构造函数(default constructor). 如果一个类的构造函数没有被定义,默认构造函数则被自动定义(此处有例外:程序将出现问题,如果类的数据成员是常数,引用或没有默认构造函数的类的类型。另外,一个类不允许有没有默认构造函数的基类)。
自动定义的默认构造函数被调用时,什么都不做。注意构造函数无返回值。
构造函数的定义
构造函数和成员函数定义类似,可以直接在类中定义,或分开单独定义。如果我们想在类中直接定义,则:
Clock () {h=m=s=0;}
构造函数将三个数据成员h,m,s设置为零。如果我们倾向于不将构造函数的定义放在类的定义之中,则给出一个单独的构造函数定义:
Clock::Clock() {h=m=s=0;}
第二个构造函数可以类似定义:
Clock::Clock(int hour,int min,int sec) {h=hour;m=min;s=sec;}
此处,成员变量从参数得到初始值。
另外一种赋值方式是在构造函数中采用初始化列表initialization list. 此表显示每一个数据成员的初始化值是多少:
Clock::Clock(int hour,int min,int sec) : h(hour), m(min), s(sec){}
h,m, s 被初始化为hour,min, sec. 注意一个函数定义必须要有函数体,因此在初始化列表后面必须有一对括号。
以上两种风格也可以混合使用:
Clock::Clock(int hour,int min,int sec) : h(hour),m(min){s=sec;}
构造函数中,采用何种初始化方法无所谓。但有时候必须用initialization list。例如,如果我们要初始化的数据成员是常数,或者引用。因为不允许给这种类型的数据赋值,所以必须用initialization list. 此外,initialization lists能生成更高效的代码,所以应该尽可能采用initialization list的方法。
相关文章推荐
- Android Native 绘图方法
- C#中struct和class的区别详解
- Lua和C语言的交互详解
- VBS ArrayList Class vbs中的数组类
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C++中拷贝构造函数的应用详解
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置