目录
1.对象的初始化和清理
2.构造函数和析构函数
3.构造函数的分类及调用
4.拷贝构造函数(复制构造函数)调用时机
5.析构函数的调用规则
6.深拷贝与浅拷贝
7.初始化列表(构造函数)
8.类对象作为类成员
9.静态成员
10.default和delete函数
一个对象或者变量没有初始状态,对其使用后果是未知的
同样的使用完一个对象或者变量,没有及时清理,也会造成一定的危害
如果我们不提供构造和析构函数,编辑器会提供,提供的构造和析构函数是空实现
构造函数的语法:类名(){}
析构函数的语法:~类名(){}
#include
using namespace std;
class person{
public:
person()//编写构造函数
{
cout<<"person构造函数的调用"<
按参数分:有参构造和无参构造
按类型分:普通构造和拷贝构造
三种调用方法:
括号法,显示法,隐式转化法
#include
using namespace std;
class person{
public:
person()//无参构造
{
cout<<"person的无参构造函数"<
#include
using namespace std;
class person{
public:
person()
{
cout<<"person的无参构造函数"<
注意:在第二种调用方法中,如果形参为person &p,则为传引用,不会调用拷贝构造函数
在第三种调用方法中,如果函数类型为person &(也为引用型),则也不会调用拷贝构造函数
默认条件下,c++编译器会提供三个函数
- 默认构造函数(无参)
- 默认析构函数(无参)
- 默认拷贝函数,对属性进行值拷贝
构造函数调用该规则:
#include
using namespace std;
class person{
public:
person(){
cout<<"person的默认构造函数调用"<
浅拷贝:简单的赋值拷贝操作
深拷贝:在堆区重新申请空间,进行拷贝工作
#include
using namespace std;
class person{
public:
person(){
cout<<"person的默认构造函数调用"<
浅拷贝带来的问题:堆区的数据重复被释放
语法:构造函数():属性1(值1),属性2(值2),属性3(值3){}
#include
using namespace std;
class person{
public:
//传统初始化操作(编译器写的)
// person(int a,int b, int c){
// m_a=a;
// m_b=b;
// m_c=c;
//}
person(int a,int b,int c):m_a(a),m_b(b),m_c(c){
}
int m_a;
int m_b;
int m_c;
};
int main(){
person p(10,20,30);
cout<
例如
class a{}
class b{
a p;
}
b类中有a类对象p作为成员
当其他类对象作为本类成员时,构造的时候先构造其他类对象,再构造自身,析构相反
#include
using namespace std;
class phone{
public:
phone(string name){ //构造函数
m_phonename=name;
cout<<"phone的构造"<
大家可能会疑惑这里为什么将一个string类型的pname赋值给phone类的m_phone
其实本质是phone m_phone=pname,这就是我们上节的第三种初始化对象的方法:隐式转化法
恭喜你看到了这里,给你点个赞
静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员
静态成员变量
静态成员函数
示例1:静态成员变量(不属于某个对象)
两种访问方式:1.通过对象进行访问
2.通过类名进行访问
(私有成员仍不可以被访问)
静态成员函数能通过对象进行访问,也能通过类名访问,但是非静态成员函数只能通过对象访问
#include
using namespace std;
class person{
public:
static int m_a;
};
int person::m_a=100; //类外初始化
int main(){
person p;
cout<
示例2:静态成员函数
#include
using namespace std;
class person{
public:
static void func(){
a=100; //静态成员函数可以访问静态成员变量
//b=1; //静态成员函数不可以访问非静态成员变量
cout<<"static void func调用"<
一些情况下,用户只想简单的使用构造函数,不想花精力在复制控制优化性能上,因此提供了default和delete两个关键字来简化构造函数的定义与使用
使用=default可以要求编译器自动生成默认(无参构造函数)或复制构造函数
与default不同的是,delete不限于在无参和复制构造函数的使用上,除析构函数外,用户都可以指定为delete删除掉
例子如下:
class a{
public:
a()=default;//默认合成的无参构造函数
a(const a& m)=delete;//删除复制构造函数