C++学习笔记十七之类的基本概念以及构造函数、析构函数、拷贝构造函数

325 阅读3分钟

类的基本概念以及构造函数、析构函数、拷贝构造函数

C++与C语言的区别

  • C++ 面向对象:以类为主
    • 面向对象:封装继承多态
    • 类:数据类型 对象的抽象
    • 对象:类这种数据类型的变量 类的实例
    • =数据成员+成员函数
    • 数据成员:属性
    • 成员函数:行为
  • C 面向过程:以函数为主

实例代码

main.cpp

void test(CHero hero)
{

}
CHero test()
{
	CHero hero;//调用无参构造函数
	return hero;
}
int main()
{
	//调用无参构造函数
	CHero hero;
	//调用带参的构造函数
	CHero hero1(300);

	cout << hero1.GetHp() << endl;

	CHero hero2(hero);//调用拷贝构造函数
	CHero hero3 = hero1;//调用拷贝构造函数
	//hero3 = hero1;//调用赋值函数
	test(hero2);//调用拷贝构造函数
	test();//调用拷贝构造函数

	return 0;
}

hero.cpp进行一个类的实现

#include "hero.h"
#include <iostream>
using namespace std;
CHero::CHero(int hp)
{
	m_Hp = hp;
	cout << "带参构造函数被调用" << endl;
}
CHero::CHero(const CHero& ref)
{
	m_Hp = ref.m_Hp;
	cout << "拷贝构造函数被调用" << endl;
}
CHero::CHero()
{
	cout << "无参构造函数被调用" << endl;
	m_Hp = 100;
}
CHero::~CHero()
{
	cout << m_Hp << endl;
	cout << "析构函数被调用" << endl;
}

类成员的访问权限

  • 成员函数一般都是公有的,数据成员一般是私有的
  • 公有的:任意位置都可以访问
  • 保护的:类以及其子类中可以访问
  • 私有的:只能类中访问

class和struct区别

  • c语言中struct表示结构
  • C++表示类,默认访问权限struct是公有的,class是私有

初始化类的数据成员方式

  • 直接初始化(类似于结构体){} 数据成员必须是公有的
  • 自定义公有的初始化函数
  • 构造函数(普通构造函数和拷贝构造函数)
  • 成员初始化列表

构造函数特点

  • 函数名类名相同;
  • 返回无返回值类型
  • 构造函数创建对象是系统自动调用
  • 创建对象两种方式: 1)类名 对象名 2)new 类名
  • 当没有显式构造函数时,系统提供默认构造函数 类名(){}
  • 构造函数可以带参(重载)

析构函数特点

  • 函数名:~类名;
  • 返回无返回值类型
  • 析构函数销毁对象是系统自动调用
  • 销毁对象两种方式: 1)生存周期结束 2)delete
  • 当没有显式析构函数时,系统提供默认析构函数 ~类名(){}
  • 析构函数无参

拷贝构造函数

定义:类名(const 类名&){}

  • 用一个对象给另外一个对象初始化
    • 显式初始化 类名 对象名1(对象名2)
    • 隐式初始化 类名 对象名1=对象名2

什么时候使用?

  • 当函数的形参为类对象
  • 当函数的返回值类型类类型;

内联函数

  • 当成员函数定义在类中时,自动变成内联函数。函数频繁被调用函数代码短少

使用:函数定义前加inline

练习代码

hero.h头文件进行类的申明

#ifndef _HERO_H_ 
class CHero
{
public:
	//定义构造函数
	CHero(int hp);
	CHero(const CHero& ref);
	CHero();
	~CHero();
	 int GetHp()//自动内联
	 {
		 return m_Hp;
	 }
private:
	int m_Hp;
};
#endif

class CString //字符串的类
{
public:
	CString(char *data=nullptr);
	~CString();
	CString(const CString &other);
	CString operator=(const CString& string);
private:
	char *m_data;
};