c++之构造函数和析构函数
int a=123;
对于整形变量a=123,创建它分为两个步骤
1、分配内存
2、对其进行初始化。
同样的对于类的对象也分为两个步骤:
People P;
1、分配内存
2、对其进行初始化——构造函数
一、什么是构造函数?
1、类的一种特殊成员函数
2、在每次创建类的新对象时执行
3、构造函数的名称与类的名称是完全相同的,不会返回任何类型
作用:构造函数用于为某些成员变量设置初始值。
二、构造函数的分类
1、默认构造函数
2、有参构造函数
3、拷贝构造函数
三、构造函数初始化
1、直接进行参数的初始化列表(效率快)
class Point
{
public:
int _x,_y;
Point(): _x(0),_y(0)
{
cout<<" default construct" <<endl;
}
};
2、在构造函数里进行赋值操作(效率慢)
class Point
{
public:
int _x,_y;
Point()
{
_x=0;
_y=0;
cout<<" default construct" <<endl;
}
};
进行构造函数,类已经完成了构造,发生的是赋值操作。
四、析构函数
1、类的一种特殊成员函数
2、在每次删除类对象时执行
3、析构函数的名称与类的名称是相同的,前面有一个~,并且不会返回任何类型。
作用:析构函数用于释放类对象管理的内存空间。
五、explicit关键字
1、explicit关键字用于修饰构造函数,防止隐式转换。
2、针对单参数的构造函数。
class Test {
public:
Test() {} // 空构造函数
explicit Test(double a); // 该构造函数无法进行隐式类类型转换
~Test() {}
};
// 调用
Test d1(12.3); // 正确
Test d2 = 1.2; // 错误,不能进行隐式类类型转换
6、类中含有静态变量
静态变量,是在编译阶段就分配空间,对象还没创建时,已经分配好空间了。
1、静态成员变量必须在类中声明,在类外定义。
2、静态数据成员不属于某个对象,在为对象分配空间中不包括静态成员所占空间。
3、静态数据成员可以通过类名或者对象名来引用。
#include<iostream>
using namespace std;
class Person{
public:
//类的静态成员属性
int a;
static int sNum;
private:
static int sOther;
};
//类外初始化,初始化时不加static
int Person::sNum = 0;
int Person::sOther = 0;
int main(){
//1. 通过类名直接访问
Person::sNum = 100;
cout << "Person::sNum:" << Person::sNum << endl;
//2. 通过对象访问
Person p1, p2;
p1.sNum = 200;
cout << "p1.sNum:" << p1.sNum << endl;
cout << "p2.sNum:" << p2.sNum << endl;
//3. 静态成员也有访问权限,类外不能访问私有成员
//cout << "Person::sOther:" << Person::sOther << endl;
Person p3;
//cout << "p3.sOther:" << p3.sOther << endl;
cout<< sizeof(Person)<< <<endl; //4字节
return 0;
}
静态成员函数
1、静态成员函数只能访问静态变量,不能访问普通成员变量
2、静态成员函数的使用和静态成员变量一样
3、普通成员函数可访问静态成员变量、也可以访问非静态成员变量
4、静态成员函数也有访问权限。
7、深拷贝和浅拷贝
浅拷贝: 增加一个指针指向已存在的内存地址。
深拷贝: 增加一个指针并申请一个新的内存,增加的指针指向新的内存。
class People
{
public:
People(int n):name(),age(n)
{
name = new char[20];
memset(name,0,20);
strcpy(name,"sszzlll");
cout<<"int construct" <<endl;
}
People(const People &p):name(),age(p.age)
{
name = new char[20];
memset(name,0,20);
strcpy(name,"sszzlll");
cout<<"int construct" <<endl;
}
private:
int age;
char* name;
int main()
{
People p(15);
People p2(p);
cout<< "age" << p.age<<"name"<<p.name<<endl;
cout<< "age" << p2.age<<"name"<<p2.name<<endl;
p.name = new char[20];
memset(p1.name,0,20);
strcpy(p.name,"szl");
cout<< "age" << p.age<<"name"<<p.name<<endl;
cout<< "age" << p2.age<<"name"<<p2.name<<endl;
return 0;
}
};
总之深拷贝与浅拷贝的主要区别是:在对象状态中包含其它对象的引用。 当拷贝一个对象时。需要拷贝这个对象引用的对象,则是深拷贝。
练习题: