嵌软八股大全8 - C++ 类
1、类 calss
1.1、基本结构
定义一个类的全局结构如下所示:
#include <iostream>
using namespace std;
// 类
class Person{
// 访问修饰符
public:
// 默认构造函数
Person() {}
// 重写构造函数
Person(int age, string name) : name(name), age(age) {}
void show();
private:
// 成员变量
int age;
string name;
// 类最后应该由 `;` 号结束
};
// 成员函数
void Person::show()
{
// this 指针
cout << "age= " << this->age << endl;
cout << "name= " << this->name << endl;
}
int main()
{
// 以默认的构造函数对类实例化
Person X;
// 以重写的构造函数对类实例化
Person T(23,"glc");
// 调用类的成员函数
T.show();
return 0;
}
1.2、对象
对象(object)是类(class)的实例化
person X;
person T(23,"glc");
1.3、类的成员
类的成员包括成员变量(类的属性)和成员函数(类的行为)
所有的成员函数函数体既可以在类中直接被定义,也可以在类内声明,然后在类外被定义
// 在类内定义成员函数
class Person{
public:
void show(){
cout << "age= " << this->age << endl;
cout << "name= " << this->name << endl;
}
};
// 在类外定义成员函数
class Person{
public:
void show();
};
void Person::show()
{
// this 指针
cout << "age= " << this->age << endl;
cout << "name= " << this->name << endl;
}
1.4、构造函数 Constructor
构造函数是在创建对象时调用的特殊函数,通常用于初始化对象,有如下几个特点
- 名称必须与类相同,且无返回值(void 也不行)
- 对象被创建时会自动调用构造函数
- 构造函数可以被重载
- 可以使用初始化列表来初始化成员变量
- 如果未定义任何构造函数,编译器将提供默认构造函数(无参数构造函数)
有以下几种构造函数
- 默认构造函数
- 参数构造函数
- 拷贝构造函数/复制构造函数
- 移动构造函数
class Person{
public:
// 1. 默认构造函数
Person() {}
// 2. 参数构造函数
Person(int age, string name) : age(age), name(name) {}
// 3. 拷贝/复制构造函数
Person(const Person &x) : age(x.age), name(x.name) {}
// 4. 移动构造函数
private:
int age;
string name;
};
在一个存在基类和派生类的 C++ 程序中,当实例化一个派生类时构造函数的调用顺序是怎样的?
- 调用基类的构造函数
- 按声明顺序创建派生类中的成员变量
- 调用派生类的构造函数
1.5、析构函数 Destructor
析构函数是在对象销毁时调用的特殊函数,用于清理资源,有如下几个特点
- 名称必须与类相同但前面有
~
符号,且无返回值(void 也不行) - 对象被销毁时会自动调用析构函数
- 一个类只能有一个析构函数,不能有参数
- 如果未定义任何析构函数,编译器将提供默认析构函数(不做任何动作)
class Person{
public:
// 默认构造函数
Person() {}
// 析构函数
~Person() {}
};
在一个存在基类和派生类的 C++ 程序中,当实例化一个派生类后,程序结束时析构函数的调用顺序是怎样的?
与构造函数调用顺序相反
- 调用派生类的析构函数
- 按声明反顺序析构派生类中的成员变量
- 调用基类的析构函数
1.6、this 指针
隐式指针,指向当前对象的地址
每个非静态成员函数都有一个this
指针,用于访问该成员函数所属对象的成员变量和其他成员函数
特殊作用:区分成员变量和参数
#include <iostream>
using namespace std;
class Person{
public:
// 使用 this 指针来区分是成员变量还是函数参数
Person(int age, string name){
this->age = age;
this->name = name;
}
void show(){
cout << "age= " << this->age << endl;
cout << "name= " << this->name << endl;
}
private:
int age;
string name;
};
int main()
{
Person T(23,"glc");
T.show();
return 0;
}
1.7、修饰符
1.7.1、访问修饰符
- public,公共的,公有成员可以被任何地方访问
- private,私有的,私有成员只能被类的成员函数和友元函数访问
- protected,保护的,保护成员可以被类及其派生类(子类)访问
1.7.2、static
静态
使用 static
修饰的成员变量 / 函数称为静态成员变量 / 函数
静态成员变量拥有如下特点
- 属于整个类,所有对象间共享同一个静态成员变量
- 必须在类外进行定义和初始化
- 在程序开始时创建,在程序结束时销毁
class Person{
public:
// 声明类内的静态成员变量
static int SUM;
};
// 在类外定义和初始化
int Person::SU
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
欢迎来到我的专栏,在这里,我将整理并分享2024年各大企业的真实笔试/面试真题,同时还整理了嵌入式软件相关的八股知识。专栏内容涵盖C/C++基础、嵌软常见通信协议、ARM、FreeRTOS、Linux OS相关问题汇总,希望能帮助求职者了解考试趋势和嵌入式常见考点。无论你是准备面试,还是希望提升自己的专业知识,这里都能为你提供宝贵的参考和学习资源。