初始化列表 形式: class Stu{ public: int a; float b; Stu() : a(12), f(12.3f){} } 作用:1、可通过数值对数据成员初始化 2、可通过构造函数参数对数据成员进行初始化 3、可通过成员之间相互初始化 在构造函数之后,且顺序无任何影响,只与声明顺序有关
1、数组的初始化列表使用 int a[4]; Stu() : a(){} 此处可以将a[4]全部初始化为0,但是注意只有VS可以这样做。 2、结构体的初始化列表 与普通元素类似,直接定义一个结构体之后,可以用它给相同的结构体直接进行赋值。 3、引用的初始化列表使用 错误示范: class Stu{ public: int a; int& b; Stu(int c) : a(b), b©{} } 注意,参数c用完就会释放,所以b的值是不确定的,无效的。 class Stu{ public: int a; int& b; Stu(int& c) : a(b), b©{} } 4、const的初始化列表 class Stu{ public: int a; int& b; const int e; Stu(int& c) : a(b), b©, e©{} }
1、malloc free与new 和delete的区别 new 和delete会触发构造和析构,而malloc和free不会。 测试代码
#include<iostream> using namespace std; class Stu { public: Stu() { cout << "构造函数" ; } ~Stu() { cout << "析构函数"; } }; int main() { Stu stu; //触发构造和析构 Stu * b = new Stu ; //触发构造 delete b; //触发析构 return 0; }const 形式:void fun() const {}; 注意:构造函数和析构函数绝对不可以是常函数 可以使用常函数外数据成员但是不可以修改,常函数内部的不做限制 this指针变更为const 类名* 常对象:const 修饰的对象 常对象只能调用常函数,不能调用普通函数。
static 形式 static int a; static void fun(){} 注意:static修饰的成员,在构造之前就存在。且所有对象共有。 静态成员类外初始化, int 类名::a = 18; 静态常量整型数据成员可以直接进行初始化:static const int a = 13.12f;其它类型不可以
形式:Stu(const Stu&) 参数是本类的常引用 1、新建一个对象,并将其初始化为同类现有对象 Stu a1(a) || Stu a2 = a || Stu* a4 = new Stu(a)均会调用拷贝构造函数 2、程序生成对象副本时, 函数参数传递对象的值 || 函数返回对象
深拷贝:浅拷贝会出现重复释放空间的问题 指针成员不能直接赋值,要用内存拷贝,memcpy,strcpyd等(拷贝构造中)
5、类之间 class AClass { public: int a; AClass(int n) :a(n){} }; class BClass { public: int b; AClass aObj; BClass(int m): aObj(m){ b = aObj.a; } BClass(const BClass& C) :aObj(b){ b = C.b; aObj.a = C.aObj.a; } };