C++复习--04

文章介绍了C++中的构造函数和析构函数的语法和作用,包括它们的自动调用、参数使用以及默认构造、析构和拷贝构造。此外,还讨论了深拷贝和浅拷贝的概念,并给出一个示例来演示如何避免浅拷贝的问题。同时,文章涵盖了静态成员变量和函数的特性,以及this指针的作用和友元函数的两种形式:全局函数、类和成员函数作为友元。
摘要由CSDN通过智能技术生成
构造函数语法: 类名 (){}
1. 构造函数,没有返回值也不写 void
2. 函数名称与类名相同
3. 构造函数可以有参数,因此可以发生重载
4. 程序在调用对象时候会自动调用构造,无须手动调用 , 而且只会调用一次
析构函数语法: ~ 类名 (){}
1. 析构函数,没有返回值也不写 void
2. 函数名称与类名相同 , 在名称前加上符号 ~
3. 析构函数不可以有参数,因此不可以发生重载
4. 程序在对象销毁前会自动调用析构,无须手动调用 , 而且只会调用一次
默认情况下,c++编译器至少给一个类添加3个函数
{
1.默认构造函数(无参,函数体为空)
2.默认析构函数(无参,函数体为空)
3.默认拷贝构造函数,对属性进行值拷贝
构造函数调用规则
1.定义有参构造,c++不会提供默认无参,会提供拷贝构造
2.定义拷贝构造,不会提供其他构造
深拷贝与浅拷贝
#include<iostream>
using namespace std;
class Person {
public:
	Person()
	{
		cout << "Person的默认构造函数调用" << endl;
	}
	Person(int age,int height)
	{
		m_age = age;
		m_height=new int(height);//深拷贝
		cout << "Person的有参构造函数调用" << endl;
	}
	//自己实现拷贝构造函数,解决浅拷贝带来的问题
	Person(const Person& p)
	{
		cout << "Person 拷贝构造函数调用" << endl;
		m_age = p.m_age;
		m_height=new int(*p.m_height);
	}
	int m_age;
	int* m_height;
	~Person()//将堆区开辟的数据释放
	{
		if (m_height != NULL)
		{
			delete m_height;
			m_height = NULL;
		}
		cout << "Person的析构构造函数调用" << endl;
	}
};
void test01()
{
	Person p1(18,185);
	cout << "p1的年龄为:" << p1.m_age<<*p1.m_height;
	Person p2(p1);
	cout << "p2的年龄为:" << p2.m_age<<*p1.m_height;
}
int main()
{
	test01();
}

初始化列表方式初始化

语法:

Person (int a,int b,int c):m_A(a),m_B(b),m_C(c);{}

Person p(1,2,3);

静态成员:

一.静态成员变量

static int a;

特点:1.类内声明,类外初始化

类外:int Person ::a=10;

2.所有成员共享一份数据

静态成员通过两种方式访问:

1.通过对象

Person p1;

p1.a;

2.通过类名//不属于某个对象

Person::a;

静态成员变量也具有访问权限

二、静态成员函数

特点 :1.程序共享一个函数

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

静态成员函数也具有访问权限

也具有两种访问方式:1.通过对象 2.通过类名

c++中,类的成员函数和成员变量分开存储

只有非静态成员变量才属于类的对象上,static不属于任何一个对象

空对象占用的内存空间是1,c++会给每个空对象分配一个字节的内存是为了区分空对象占内存的位置

this指针指向被调用的成员函数所属的对象

this指针隐含在每一个非静态成员函数内,无需定义,直接使用

意义:1.解决形参与成员变量同名的问题

2.类的非静态成员函数返回对象本身,使用return *this

Person (int age)
{
    this->age=age;
}
int age
Person& add(Person &p)
{
    this->age+=p.age;
    return *this;
}

p.add(p1).add(p1).add(p1);

空指针可以调用成员函数;但如果成员函数中含有this指针,

需要写

if(this==NULL)

{

        return ;

}

常函数不可以修改成员属性

成员函数后加const就叫常含数

成员属性加mutable后,常含数依然可以修改

常对象只能调用常含数

全局函数做友元

#include<iostream>
using namespace std;
#include <string>
class Building {
	//goodgay 可以访问Building中的私有成员
	friend void goodgay(Building* building);
public:
	Building(){
		m_settingroom = "客厅";
		m_bedroom = "卧室";
	}
public:
	string m_settingroom;
private:
	string m_bedroom;
};
void goodgay(Building* building)
{
	cout << "好朋友正在访问:" << building->m_settingroom << endl;
	cout << "好朋友正在访问:" << building->m_bedroom << endl;

}
int main()
{
	Building building;
	goodgay(&building);

}

类做友元

#include<iostream>
using namespace std;
#include <string>
class Goodgay {
public:
	Goodgay();
	void visit();
private:
	Building *building;
};
class Building {
	friend class Goodgay;
public:
	string m_settingroom;
private:
	string m_bedroom;
public:
	Building();
};
Building::Building()
{
	this->m_settingroom = "客厅";
	this->m_bedroom = "卧室";
}
Goodgay::Goodgay()
{
	building = new Building;
}
void Goodgay::visit()
{
	cout<<"好基友正在访问"<<building->m_bedroom<<endl;
}
int main()
{
	Goodgay gg;
	gg.visit();
}

成员函数做友元

#include<iostream>
using namespace std;
#include<string>
class goodgay {
public:
	goodgay();
	
	void visit();//可以访问Building中私有成员
	void visit2();//不可以访问Building中私有成员
private:
	Building* building;
};
class Building {
	friend void goodgay:: visit();
public:
	string m_settingroom;
private:
	string m_bedroom;
public:
	Building();
};
Building::Building()
{
	this->m_settingroom = "客厅";
	this->m_bedroom = "卧室";
}
goodgay::goodgay()
{
	building = new Building;
}
void goodgay::visit()
{
	cout << building->m_bedroom;
}
void goodgay::visit2()
{
	cout << building->m_settingroom;
}
int main()
{
	goodgay gg;
	gg.visit();
	gg.visit2();
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值