久 等 了
参数列表后写一个const描述成员函数,使其不能修改调用对象。(其实就是把隐式this引用变成常引用)
不能const
理性思考一下,const还构造个卵
即使常对象,构造过程也可以修改,构造结束后才打上const标签
没构造函数的话编译器会帮你搓一个
如果有了它就不帮你了,如果你还想用它搓:
MyClass() = default;
即可
拷贝构造就是常引用参数constructor
赋值是对等号的重载
需要注意的是,在初始化时即使用等号也会走拷贝构造。
默认拷贝构造和赋值走到都是内置类型直接拷贝,类类型走对应拷贝构造/赋值构造
让函数或类称为你的朋友
直接访问的你私有变量
声明友元函数或类的主体是友元,而不是对应的函数或类。
所以得先让他可见才能用它,仅仅告诉编译器他是你的朋友不是用他的前提。
别名也可以放到类内,甚至可以加访问约束符。
class std::string ... {
...
public:
typedef std::size_t size_type;
//using size_type = std::size_t;
...
}
即使在const成员内也能修改的属性可以用mutable修饰。
编译器在处理类中全部声明后才会去管函数的具体定义。
类外类型名如果类内先用,再定义同名类型,则代码有错。
//但是编译器不管,总之这事别做就好
- 就是冒号后花括号前那一串
- const和引用的唯一初始化机会就在这里了
- 初始化顺序仅参照类内属性声明顺序
- 如果一个构造函数的参数都有默认值,那它就是默认构造函数
"把一函数的温暖,转移到另一个的胸膛,让上次写的码复用出光芒。"
class testClass{
public:
testClass(int a,string b) : a(a),b(b) {};
testClass(string b) : testClass(0, b) {};
private:
int a;
string b;
};
默认初始化
- 块作用域内,不用初始值,定义非静态变量
- 合成构造函数对类类型成员
- 类类型成员在构造列表中缺失 值初始化
- 数组初始化,初始值中没有被提供的部分
- 局部静态变量不用初始值定义
- className()
都会走默认构造函数
如果构造函数只接一个实参,那么它可以提供隐式类型转换规则。它叫转换构造函数。
不过这个转换只能一步,不能连链。
只能用于直接初始化,不能用于赋值构造。
如果你不想让这种构造函数提供这种功能,请用explicit修饰。
聚合类有如下要求
-
所有成员public
-
没有定义构造函数
-
没有类内初始值
-
没有基类和虚函数 //就是个C struct
它的特点是可以用花括号初始化(顺序与声明顺序一致)
//就是编译时类
要求如下
- 数据成员全部constexpr
- 含有至少一个constexpr构造函数
- 基础数据类型成员若有初始值,则必须是constexpr表达式
- 类类型成员若有初始值,必须调用constexpr构造函数
- 使用析构函数的默认定义
或者
- 是一个充满了constexpr的聚合类
static成员在类初始化的时候不会管
除非你给他同constexpr修饰并给它初始值
这时如果你外面不用它就不用在外定义,用的话还是要定义一哈。
后记:
我突然觉得
构造函数应该叫构造后函数
析构函数应该叫析构前函数
真正对象的构造和析构可轮不到我这个憨憨动手