c++ primer 笔记第九天
我们定义非成员函数的方式与其他函数一样,通常把函数的声明和定义分离开来。如果函数在概念上属于类但不定义在类中则它一般与类声明(而非定义)在同一个头文件中。在这种方式下,用户使用接口的任何部分都只需要引入一个文件
构造函数的名字和类名相同。和其他函数不一样的是,构造函数没有返回类型
构造函数不能声明成const
某些类不能依赖合成的构造函数
一:编译器只有在发现类不包含任何构造函数的情况下,才会替我们生成一个默认的构造函数。一旦我们定义了一些其他构造函数,那么除非我们再定义一个默认的构造函数。一旦我们定义了其他的构造函数,那么除非我们再定义一个默认的构造函数,否则类将没有默认构造函数。这条规则的依据是,如果一个类在某种情况下需要控制对象的初始化,那么该类很可能在所有情况下都需控制
二:合成的默认构造函数可能执行错的操作。回忆我们之前介绍过的,如果定义在块中的内置类型或符合类型(比如指针和数组)的对象被默认初始化,则他们的值将是未定义的该准则同样适用于默认初始化的内置类型成员。因此含有内置类型或复合类型成员的类应该在类的内部初始化这些成员,或者定义一个自己默认的构造函数否则,用户在创建类的对象时就可能得到未定义的值
三:编译器不能为默写类合成构造函数
在c11新标准中,如果我们需要默认的行为,那么可以通过在参数后面写=default来要求编译器生成构造函数
当某个数据成员被构造函数初始值列表忽略是,它将以与合成默认构造函数相同的方式隐式初始化
构造函数不应该覆盖掉类内的初始化,除非新赋值的值与原值不同。如果你不能使用类内初始值,则所有构造函数都应该显示初始化每个内置类型的成员
没有出现在构造函数初始值列表中的成员将通过相应的类内初始值(如果存在的话)初始化,或者执行默认初始化
友员
类可以允许其他类或者函数访问他的非公有成员,方法是令他类或者函数成为他的友员。
最好在类定义开始或结束前位置集中声明友员
为了使用友员对类的用户可见,我们通常把友员的声明与类本身放置在同一个头文件中(类的外部),提供独立声明。