您的位置:首页 > 编程语言 > C语言/C++

c++知识总结(1)

2017-08-08 11:42 232 查看
1.不同于其它成员函数,构造函数不能被声明称const的:

const是可以修饰类的成员函数,但是该函数不能修改数据成员。构造函数也属于类的成员函数,但是构造函数是要修改类的成员变量,所以类的构造函数不能申明成const类型的。

2.某些类不能依赖合成的默认构造函数:

第一个原因,编译器只有在发现类不包含任何构造函数的情况下才会替我们生成 生成一个默认的构造函数。一旦我们定义了一些其他的构造函数,那么除非我们再定义一个默认的构造函数,否则类将没有默认构造函数。这条规则的依据是,如果一个类在某种情况下需要控制对象初始化,那么该类很可能在所有情况下都需要控制。

第二个原因,对于某些类来说,合成的默认构造函数可能执行错误的操作。回忆我们之前介绍过的,如果定义在块中的内置或复合内型(比如数组和指针)的对象被默认初始化,则它们的值时未定义的。该准则同样适合于默认初始化的内置类型成员。因此,含有内置类型或复合类型成员的类应该在类的内部初始化这些成员,或者定义一个自己的默认构造函数。否则,用户在创建类的对象时就可能得到未定义的值。

第三个原因,有的时候,编译器不能为某些类合成默认的构造函数。例如,如果类中包含一个其他类型的成员且这个成员的类型没有默认构造函数,那么编译器无法初始化该成员。

3.为什么只有声明而没有定义的类不能定义其对象类型呢? 
因为如果类没有定义,编译器就不知道为这个对象分配多大空间,但是类的指针或引用类型的大小与类大小无关。 
当编译器遇到 } 表示一个类的定义结束。 
所以在一个类中,可以定义其自身的指针或引用类型,但是却不能定义其对象类型。因为类的定义还没有结束,无法确定其对象所占空间的大小。

4.构造函数的初始值有时必不可少

如果成员是const、引用,或者属于某种未提供默认构造函数的累类型,我们必须通过构造函数初始值列表为这些成员提供初始值。

5.构造函数成员初始化的顺序

成员的初始化顺序与它们在类定义中的出现顺序一致:第一个成员先被初始化,然后第二个,依次类推。构造函数初始值列表中初始值的前后关系不会影响实际的初始化顺序。一般来说,初始化的顺序没什么特别要求。不过如果一个成员是用另一个成员来初始化的,那么这两个成员的初始化顺序就很关键了。

6.explicit构造函数只能用于直接初始化

当我们用explicit关键字声明构造函数时,它将只能以直接初始化的形式使用。而且,编译器将不会在自动转换过程中使用该构造函数。

7.类的静态成员

类的静态成员存在任何对象之外,对象中不包含任何与静态数据成员有关的数据。静态成员函数也不与任何对象绑定在一起,它们不包含this指针。作为结果,静态成员函数不能声明成const的,而且我们也不能在static函数体内使用this指针。这一限制既适用于this的显示使用,也对调用非静态成员的隐式使用有效。
当在类的外部定义静态成员时,不能重复static关键字,该关键字只出现在类内部的声明语句。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: