深拷贝和浅拷贝、构造函数和析构函数、this指针初识

构造函数按两种类型分

1.有无参数

2.普通构造和拷贝构造

#include<iostream>
using namespace std;
/*
构造函数:
	1.类型:普通构造、拷贝构造
	2.参数:有参和无参
*/
class Person 
{
public:
	//无参构造函数
	Person()
	{
		cout << "无参构造函数调用" << endl;
	}
	//有参构造函数
	Person(int a)
	{
		age = a;
		cout << "有参构造函数调用" << endl;
	}
	//拷贝析构函数
    //传进一个Person p,完全复制它;const:确保原来的Person对象不被改变
	Person(const Person& p) 
	{
		age = p.age;
		cout << "拷贝函数调用" << endl;
	}

	//析构函数
	~Person()
	{
		cout << "析构函数调用" << endl;
	}

private:
	int age;
};

int main1()
{
	//注意:调用无参构造函数不能加括号,如果加了括号,编译器会认为这是一个函数的声明
	//Person p1; //无参构造函数
	//1.括号法
	Person p1(10); //有参构造函数
	Person p2(p1); //拷贝构造函数
	//2.显示法
	cout << endl;
	Person p3 = Person(10); //有参构造函数
	Person p4 = Person(p1); //拷贝构造函数
	//3.隐式转换法
	cout << endl;
	Person p5 = 10; //有参构造函数 -- 相当于Person p5 = Person(10)
	Person p6 = p5; //拷贝构造函数 -- 相当于Person p6 = Person(p5)

	return EXIT_SUCCESS;
}

  1. 构造函数的调用规则
    1. 系统会默认给一个类添加至少3个函数:默认构造函数、拷贝构造函数、析构函数。
    2. 如果提供有参构造、系统不会提供默认构造,但是会提供拷贝构造。
    3. 如果提供拷贝构造,其他构造函数都不提供了。
  2. 深拷贝与浅拷贝
    1. 系统提供拷贝构造函数 只会做简单的值拷贝
    2. 如果类中有属性开辟到堆区,那么在释放时候 ,由于浅拷贝问题导致堆区内容会重复释放,程序down掉
    3. 利用深拷贝 来解决浅拷贝的问题
  3. 初始化列表
    1. 构造函数名称(): 属性值(),属性值().....{}
  4. 类对象作为类成员
    1. 先构造其他类对象,再构造本类对象,先析构本类对象,再析构其他类对象

静态成员

在成员变量前 + static

特点:

        1.共享一份数据

        2.编译阶段分配内存

        3.类内声明,类外初始化

访问特点:

        1.通过对象

        2.通过类名

静态成员函数只能访问静态成员变量

this指针

        特点:指向被 调用的成员函数 所属的对象

        *this:指所属对象本体

        链接编程,通过返回*this返回对象本体,成员函数用 :类名 * 函数名(类名 & 对象名)定义

猜你喜欢

转载自blog.csdn.net/Jack_wenbai/article/details/128721493
今日推荐