C++笔记——防止混乱

类:

一、构造函数

初始化列表
形式:
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和静态成员static

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;
}
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章