嵌软八股大全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

构造函数是在创建对象时调用的特殊函数,通常用于初始化对象,有如下几个特点

  1. 名称必须与类相同,且无返回值(void 也不行)
  2. 对象被创建时会自动调用构造函数
  3. 构造函数可以被重载
  4. 可以使用初始化列表来初始化成员变量
  5. 如果未定义任何构造函数,编译器将提供默认构造函数(无参数构造函数)

有以下几种构造函数

  1. 默认构造函数
  2. 参数构造函数
  3. 拷贝构造函数/复制构造函数
  4. 移动构造函数
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. 调用基类的构造函数
  2. 按声明顺序创建派生类中的成员变量
  3. 调用派生类的构造函数

1.5、析构函数 Destructor

析构函数是在对象销毁时调用的特殊函数,用于清理资源,有如下几个特点

  1. 名称必须与类相同但前面有 ~ 符号,且无返回值(void 也不行)
  2. 对象被销毁时会自动调用析构函数
  3. 一个类只能有一个析构函数,不能有参数
  4. 如果未定义任何析构函数,编译器将提供默认析构函数(不做任何动作)
class Person{  
public:
	// 默认构造函数
	Person() {}
	// 析构函数
	~Person() {}
};

在一个存在基类和派生类的 C++ 程序中,当实例化一个派生类后,程序结束时析构函数的调用顺序是怎样的?

与构造函数调用顺序相反

  1. 调用派生类的析构函数
  2. 按声明反顺序析构派生类中的成员变量
  3. 调用基类的析构函数

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、访问修饰符

  1. public,公共的,公有成员可以被任何地方访问
  2. private,私有的,私有成员只能被类的成员函数和友元函数访问
  3. protected,保护的,保护成员可以被类及其派生类(子类)访问

1.7.2、static 静态

使用 static 修饰的成员变量 / 函数称为静态成员变量 / 函数

静态成员变量拥有如下特点

  1. 属于整个类,所有对象间共享同一个静态成员变量
  2. 必须在类外进行定义和初始化
  3. 在程序开始时创建,在程序结束时销毁
class Person{  
public:
	// 声明类内的静态成员变量
	static int SUM;
};
// 在类外定义和初始化
int Person::SU

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

欢迎来到我的专栏,在这里,我将整理并分享2024年各大企业的真实笔试/面试真题,同时还整理了嵌入式软件相关的八股知识。专栏内容涵盖C/C++基础、嵌软常见通信协议、ARM、FreeRTOS、Linux OS相关问题汇总,希望能帮助求职者了解考试趋势和嵌入式常见考点。无论你是准备面试,还是希望提升自己的专业知识,这里都能为你提供宝贵的参考和学习资源。

全部评论

相关推荐

评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务