C++ 类和对象示例

⚡ 智能摘要

类和对象 C++ 构成面向对象编程的基础,其中类定义了数据和成员函数的蓝图,对象是根据该蓝图创建的具体实例。

  • 🔷 课程蓝图: A C++ 类将数据成员和成员函数捆绑到一个用户定义的类型中。
  • ???? 访问修饰符: private、public 和 protected 关键字控制类成员的访问权限。
  • 🧱 对象实例化: 使用语法“类名 对象名”从类创建对象。
  • 👉 会员权限: 点运算符用于访问公共成员,而成员函数用于操作存储的数据。
  • ⚙️ 构造函数: 构造函数会自动初始化对象,析构函数会在对象超出作用域时将其释放。
  • 🤖 人工智能辅助: GitHub Copilot 和类似的 AI 助手可以根据简短的评论生成类定义和构造函数。

C++ 类和对象

什么是类?

A C++ 类将数据和用于操作数据的方法合二为一。类还决定了对象的形式。类中包含的数据和方法称为类成员。类是用户定义的数据类型。要访问类成员,我们使用类的实例。您可以将类视为对象的蓝图。

一个类可以作为房屋的原型。它展示了门、窗、地板等的位置和尺寸。根据这些描述,我们可以构建一栋房屋。这栋房屋就成为了一个对象。我们可以从原型创建多栋房屋。同样,我们也可以从一个类创建多个对象。

C++ 将类作为对象的蓝图

在上图中,我们有一个房屋原型。从这个原型开始,我们创建了两栋具有不同特征的房屋。

牢记类作为蓝图的概念,下一步就是看看如何在代码中声明一个类。

类别声明

In C++使用 class 关键字定义类。后面应跟类名。然后,将类体添加到花括号 { } 中。

句法

class class-name
   {
   // data
   // functions
   };
  • 类名 是要分配给该类的名称。
  • data 是类的数据,通常声明为变量。
  • 功能 是类函数。

声明类名和类体后,自然会引出谁可以使用每个成员的问题。

私有和公共关键字

你一定遇到过这两个关键字。它们是访问修饰符。

私人:

当使用 private 关键字定义函数或类时,该函数或类即变为私有函数或类。此类函数或类只能在类内访问。

上市:

另一方面,public 关键字使数据/函数公开。它们可以从类外部访问。

类存在之后,就可以从中创建对象,就像从数据类型创建变量一样。

对象定义

对象由类创建。类对象的声明方式与变量的声明方式类似。类名必须放在前面,对象名放在后面。对象属于该类的类型。

句法

class-name object-name;
  • 类名 是要从中创建对象的类的名称。
  • 对象名 是要分配给新对象的名称。

从类创建对象的过程称为实例化。

对象创建完成后,可以通过简单的运算符直接访问其公共成员。

访问数据成员

要访问类的公共成员,我们使用 (.) 点运算符。这些成员标有公共访问修饰符。

例子1

#include <iostream>
using namespace std;
class Phone {
public:
	double cost;   
	int slots; 
};
int main() {
	Phone Y6;        
	Phone Y7;        

	Y6.cost = 100.0;
	Y6.slots = 2;

	Y7.cost = 200.0;
	Y7.slots = 2;
	cout << "Cost of Huawei Y6 : " << Y6.cost << endl;
	cout << "Cost of Huawei Y7 : " << Y7.cost << endl;

	cout << "Number of card slots for Huawei Y6 : " << Y6.slots << endl;
	cout << "Number of card slots for Huawei Y7 : " << Y7.slots << endl;

	return 0;
}

输出:

C++ 访问公共数据成员示例 1 输出

以下是代码截图:

C++ 访问公共数据成员示例 1 代码

Code 说明:

  1. 在我们的代码中包含 iostream 头文件以便使用其功能。
  2. 在我们的代码中包含 std 命名空间以便使用它的类而不调用它。
  3. 声明一个名为 Phone 的类。
  4. 使用公共访问修饰符将我们即将创建的变量标记为可公开访问。
  5. 声明双精度数据类型的变量成本。
  6. 声明一个名为 slots 的整型变量。
  7. 课堂主体结束。
  8. 调用main()函数。程序逻辑应添加到其主体内。
  9. 创建一个名为 Y6 且类型为 Phone 的对象。这称为实例化。
  10. 创建一个名为 Y7 且类型为 Phone 的对象。这称为实例化。
  11. 使用对象 Y6 访问 Phone 类的变量/成员成本。该值设置为 100.0。Y6 的成本现在设置为 100.0。
  12. 使用对象 Y6 访问 Phone 类的变量/成员槽。值设置为 2。Y6 的槽现在设置为 2。
  13. 使用对象 Y7 访问 Phone 类的变量/成员成本。该值设置为 200.0。Y7 的成本现在设置为 200.0。
  14. 使用对象 Y7 访问 Phone 类的变量/成员槽。值设置为 2。Y7 的槽现在设置为 2。
  15. 将 Y6 的成本与其他文本一起打印在控制台上。
  16. 将 Y7 的成本与其他文本一起打印在控制台上。
  17. 与其他文本一起打印 Y6 的插槽数量。
  18. 与其他文本一起打印 Y7 的插槽数量。
  19. 程序成功完成后必须返回一个值。
  20. main() 函数体结束。

公开成员可以访问外部代码,但私有成员遵循更严格的访问规则。

什么是私人课程?

标记为私有的类成员只能由类内定义的函数访问。类外定义的任何对象或函数都不能直接访问此类成员。私有类成员只能由成员和友元函数访问。

例子2

#include <iostream>
using namespace std;
class ClassA {
public:
	void set_a(int val);
	int get_a(void);

private:
	int a;
};
int ClassA::get_a(void) {
	return a;
}
void ClassA::set_a(int val) {
	a = val;
}
int main() {
	ClassA a;
	a.set_a(20); 
	cout << "Value of a is: " << a.get_a(); 
	return 0;
}

输出:

C++ 私有类成员示例 2 输出

以下是代码截图:

C++ 私有类成员示例 2 代码

Code 说明:

  1. 在我们的代码中包含 iostream 头文件以使用其功能。
  2. 在我们的代码中包含 std 命名空间,以便使用它的类而不调用它。
  3. 创建一个名为 ClassA 的类。
  4. 使用公共访问修饰符将要创建的类成员标记为可公开访问。
  5. 创建名为 set_a() 的函数,该函数接受一个整数值 val。
  6. 创建一个名为get_a()的函数。
  7. 使用私有访问修饰符将要创建的类成员标记为私有可访问。
  8. 声明一个名为a的整型变量。
  9. 课堂主体结束。
  10. 使用类名和范围解析运算符来访问函数 get_a()。我们想要定义该函数在调用时执行的操作。
  11. 函数 get_a() 在调用时应该返回变量 a 的值。
  12. 函数 get_a() 定义结束。
  13. 使用类名和范围解析运算符来访问函数 set_a()。我们想要定义该函数在调用时执行的操作。
  14. 将变量val的值赋给变量a。
  15. 函数 set_a() 定义结束。
  16. 调用 main() 函数。程序逻辑应添加在此函数主体内。
  17. 创建 ClassA 的一个实例并赋予其名称 a。
  18. 使用上述类实例和函数 set_a() 将值 20 分配给变量 a。
  19. 在控制台上打印一些文本以及变量 a 的值。变量 a 的值是通过调用 get_a() 函数获取的。
  20. 程序成功完成后必须返回值。
  21. 函数 main() 主体结束。

受保护成员介于私有成员和公共成员之间,增加了一项关键的继承功能。

什么是受保护类别?

标记为 protected 的类成员比标记为 private 的类成员有优势。它们可以由其定义类中的函数访问。此外,它们还可以从派生类访问。

例子3

#include <iostream>
using namespace std;
class ParentClass {
protected:
	int value;
};
class ChildClass : public ParentClass {
public:
	void setId(int x) {
		value = x;
	}
	void displayValue() {
	cout << "Value is: " << value << endl;
	}
};
int main() {
	ChildClass c;
	c.setId(21);
	c.displayValue();
	return 0;
}

输出:

C++ 受保护类成员示例 3 输出

以下是代码截图:

C++ 受保护类继承示例 3 代码

Code 说明:

  1. 在我们的代码中包含 iostream 头文件以使用其功能。
  2. 在我们的代码中包含 std 命名空间,以便使用它的类而不调用它。
  3. 创建一个名为 ParentClass 的类。
  4. 使用受保护的访问修饰符将要创建的类成员标记为受保护的。
  5. 创建一个名为value的整型变量。
  6. 课堂主体结束。
  7. 创建一个名为 ChildClass 的新类,继承 ParentClass。
  8. 使用受保护的访问修饰符将要创建的类成员标记为子类可访问。
  9. 创建名为 setId() 的函数,该函数接受一个整数值 x。
  10. 将变量 x 的值分配给变量值。
  11. 函数 setId() 定义结束。
  12. 创建一个名为displayValue()的函数。
  13. 将名为 value 的变量的值与其他文本一起打印在控制台上。
  14. 函数 displayValue() 主体结束。
  15. ChildClass 类的主体结束。
  16. 调用 main() 函数。程序逻辑应添加在此函数主体内。
  17. 创建 ChildClass 的一个实例并将其命名为 c。
  18. 使用上述类实例和函数 setId() 将值 21 分配给变量 x。
  19. 使用上述类实例调用名为displayValue()的函数。
  20. 程序成功完成后必须返回值。
  21. 函数 main() 主体结束。

除了存储数据之外,类还将操作这些数据的函数分组在一起。

类成员函数

函数帮助我们操作数据。类成员函数可以用两种方式定义:

  • 在类定义中
  • 类定义之外

如果要在类定义之外定义函数,则必须使用范围解析运算符 (::)。这应该伴随类和函数名称。

例子4

#include <iostream>
#include <string>
using namespace std;
class Guru99
{
public:
	string tutorial_name;
	int id;
	void printname();
	void printid()
	{
		cout << "Tutorial id is: "<< id;
	}
};
void Guru99::printname()
{
	cout << "Tutorial name is: " << tutorial_name;
}
int main() {
	Guru99 guru99;
	guru99.tutorial_name = "C++";
	guru99.id = 1001;
	guru99.printname();
	cout << endl;
	guru99.printid();
	return 0;
}

输出:

C++ 类成员函数示例 4 输出

以下是代码截图:

C++ 类成员函数示例 4 代码

Code 说明:

  1. 在我们的程序中包含iostream头文件以使用其功能。
  2. 在我们的程序中包含字符串头文件以使用其功能。
  3. 在我们的代码中包含 std 命名空间,以便使用它的类而不调用它。
  4. 创建一个名为 Guru99.
  5. 使用 public access 修饰符将我们即将创建的类成员标记为可公开访问。
  6. 创建一个名为tutorial_name的字符串变量。
  7. 创建一个名为id的整型变量。
  8. 创建一个名为 printname() 的函数。此函数未在类定义中定义。
  9. 创建一个名为 printid() 的函数。该函数定义在类定义中。其函数体也已添加到类定义中。
  10. 在控制台上打印变量 id 的值以及其他文本。请注意,这已添加到 printid() 函数主体中。它仅在调用 printid() 函数时执行。
  11. printid() 函数体结束。
  12. 课程主体部分结束 Guru99.
  13. 函数 printname() 定义的开始。
  14. 在控制台上打印变量 tutorial_name 的值以及其他文本。请注意,这已添加到 printname() 函数主体中。它仅在调用 printname() 函数时执行。
  15. printname() 函数定义结束。
  16. 调用 main() 函数。程序逻辑应添加在此函数主体内。
  17. 创建类的实例 Guru99,并将其命名为guru99。
  18. 使用上述实例来分配值 C++ 到变量 tutorial_name。
  19. 使用guru99实例将值1001分配给变量id。
  20. 使用实例 guru99 调用函数 printname() 。
  21. 调用end(结束行)命令在控制台上打印一个新的空白行。
  22. 使用实例guru99调用函数printid()。
  23. 程序成功完成后必须返回值。
  24. main() 函数体结束。

当对象被创建和销毁时,有两个特殊的成员函数会自动运行。

构造函数和析构函数

什么是构造函数?

构造函数是用于初始化对象的特殊函数。 C++ 编译器 创建对象时需要调用构造函数。构造函数用于给类成员赋值。当然,这需要在为类成员分配内存空间之后进行。

什么是析构函数?

另一方面,析构函数有助于销毁类对象。

构造函数名称必须与类名相似。构造函数没有返回类型。

构造函数可以在类体内部或外部定义。如果在类体外部定义,则应使用类名和作用域解析运算符 (::) 来定义。

例子5

#include <iostream>  
using namespace std;
class ClassA {
public:
	ClassA() {
		cout << "Class constructor called"<<endl;
	}
	~ClassA() {
		cout << "Class destructor called"<<endl;
	}
};

int main() {
	ClassA a;
	int p = 1;
		if (p) {
			ClassA b; 
		}   
}

输出:

C++ 构造函数和析构函数示例 5 输出

以下是代码截图:

C++ 构造函数和析构函数示例 5 代码

Code 说明:

  1. 将 iostream 头文件包含到代码中以使用其功能。
  2. 在我们的代码中包含 std 命名空间,以便使用它的类而不调用它。
  3. 创建一个名为 ClassA 的类。
  4. 使用公共访问修饰符将我们即将创建的成员标记为可公开访问。
  5. 为该类创建一个构造函数。
  6. 调用构造函数时在控制台上打印的文本。endl 是 C++ 关键字,表示结束行。它将鼠标光标移动到下一行。
  7. 类构造函数主体的结束。
  8. 为该类创建一个析构函数。
  9. 调用析构函数时在控制台上打印的文本。endl 是 C++ 关键字,表示结束行。它将鼠标光标移动到下一行。
  10. 析构函数主体的结束。
  11. 课堂主体结束。
  12. 调用 main() 函数。程序逻辑应添加在此函数主体内。
  13. 创建一个类对象并赋予其名称a。构造函数将被调用。
  14. 创建一个名为 p 的整型变量并赋值 1。
  15. 使用变量 p 创建一个 if 语句块。
  16. 创建一个类对象并将其命名为b。析构函数将被调用。
  17. if 语句主体结束。
  18. main() 函数体结束。

常见问题

类是用户自定义的蓝图,它将数据成员和成员函数组合成一种类型。对象是基于该类构建的具体实例,它保存着蓝图所描述的数据副本。

主要区别在于默认访问权限:类的成员默认是私有的,而……的成员默认是私有的。 结构体 默认情况下都是公开的。两者都支持继承、构造函数和封装。 C++.

C++ 支持三种常见的构造函数类型:无参的默认构造函数、接受值以初始化成员的带参数构造函数,以及从同一类的现有对象创建新对象的复制构造函数。

友元函数是一种非成员函数,它被授予访问类的私有成员和受保护成员的权限。它在类内部使用 `friend` 关键字声明,但在类外部像普通函数一样定义。

this 指针是每个非静态成员函数内部都可用的隐式指针。它指向调用该函数的对象,允许代码引用该对象自身的成员,并解决参数和数据成员之间的命名冲突。

封装将数据及其操作函数打包到一个类中,然后使用私有成员隐藏内部细节。公共成员函数公开一个受控接口,从而保护数据免受意外或未经授权的访问。

是的。AI 代码助手可以将简短的提示或注释转换为可用的类定义,包括数据成员、访问说明符、构造函数和成员函数。编译代码之前,务必检查生成的访问级别和初始化逻辑。

是的。 GitHub 副驾驶 它会在你输入时提示类声明、构造函数、getter 和 setter 方法。它能快速处理重复的样板代码,但你仍然应该在构建之前验证成员访问权限、构造函数逻辑和对象使用情况。

总结一下这篇文章: