类的基本概念以及构造函数、析构函数、拷贝构造函数
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;
};