C++ 类与对象及示例

什么是类?

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

类可以是一个房屋的原型。它展示了门、窗、地板等的.位置和大小。根据这些描述,我们可以建造一栋房子。这栋房子就成了对象。可以从原型建造许多房子。同样,也可以从一个类创建许多对象。

C++ Class

在上图中,我们有一个房屋原型。基于此原型,我们创建了两栋具有不同特征的房屋。

类声明

在 C++ 中,使用 `class` 关键字定义类。之后跟类名。类主体然后添加在大括号 `{ }` 之间。

语法

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

Private 和 Public 关键字

您可能已经遇到过这两个关键字。它们是访问修饰符。

  • 私有链

当使用 `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;
}

输出

Accessing Data Members

这是代码的屏幕截图:

Accessing Data Members

代码解释:

  1. 在代码中包含 iostream 头文件以使用其函数。
  2. 在代码中包含 std 命名空间,以便在不调用其名称的情况下使用其类。
  3. 声明一个名为 Phone 的类。
  4. 使用 public 访问修饰符将我们要创建的变量标记为公共可访问。
  5. 声明一个 double 类型的变量 cost。
  6. 声明一个名为 slots 的整数变量。
  7. 类主体的结束。
  8. 调用 main() 函数。程序逻辑应添加到其主体中。
  9. 创建名为 Y6 的 Phone 类型对象。这称为实例化。
  10. 创建名为 Y7 的 Phone 类型对象。这称为实例化。
  11. 使用对象 Y6 访问类 Phone 的变量/成员 cost。值设置为 100.0。Y6 的 cost 现在设置为 100.0。
  12. 使用对象 Y6 访问类 Phone 的变量/成员 slots。值设置为 2。Y6 的 slots 现在设置为 2。
  13. 使用对象 Y7 访问类 Phone 的变量/成员 cost。值设置为 200.0。Y7 的 cost 现在设置为 200.0。
  14. 使用对象 Y7 访问类 Phone 的变量/成员 slots。值设置为 2。Y7 的 slots 现在设置为 2。
  15. 在控制台打印 Y6 的 cost 以及其他文本。
  16. 在控制台打印 Y7 的 cost 以及其他文本。
  17. 在控制台打印 Y6 的 slots 数量以及其他文本。
  18. 在控制台打印 Y7 的 slots 数量以及其他文本。
  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;
}

输出

Accessing Data Members

这是代码的屏幕截图:

Accessing Data Members

代码解释

  1. 包含 iostream 头文件到我们的代码中以使用其函数。
  2. 包含 std 命名空间到我们的代码中以使用其类而无需调用其名称。
  3. 创建一个名为 ClassA 的类。
  4. 使用 public 访问修饰符将要创建的类成员标记为公共可访问。
  5. 创建名为 set_a() 的函数,该函数接受一个整数值 val。
  6. 创建名为 get_a() 的函数。
  7. 使用 private 访问修饰符将要创建的类成员标记为私有可访问。
  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() 函数主体的结束。

示例 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;
}

输出

Accessing Data Members

这是代码的屏幕截图:

Accessing Data Members

代码解释

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

类成员函数

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

  • 在类定义内部
  • 在类定义外部

如果一个函数要在类定义外部定义,我们必须使用作用域解析运算符 (::)。这应该伴随类名和函数名。

示例 2

#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;
}

输出

Class Member Functions

这是代码的屏幕截图:

Class Member Functions

代码解释

  1. 将 iostream 头文件包含到我们的程序中以使用其函数。
  2. 将 string 头文件包含到我们的程序中以使用其函数。
  3. 包含 std 命名空间到我们的代码中以使用其类而无需调用其名称。
  4. 创建一个名为 Guru99 的类。
  5. 使用 public 访问修饰符将我们即将创建的类成员标记为公共可访问。
  6. 创建一个名为 tutorial_name 的 string 变量。
  7. 创建一个名为 id 的整数变量。
  8. 创建一个名为 printname() 的函数。该函数未在类定义中定义。
  9. 创建一个名为 printed() 的函数。该函数在类定义中定义。其主体已添加到类定义中。
  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 (end line) 命令在控制台打印一个新空行。
  22. 使用实例 guru99 调用 printid() 函数。
  23. 程序在成功完成后应返回值。
  24. main() 函数主体的结束。

构造函数和析构函数

什么是构造函数?

构造函数是初始化对象的特殊函数。C++ 编译器在创建对象时调用构造函数。构造函数有助于为类成员分配值。当然,这是在它们被分配了一些内存空间之后。

什么是析构函数?

析构函数则有助于销毁类对象。

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

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

示例 3

#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; 
		}   
}

输出

Constructors and Destructors

这是代码的屏幕截图:

Constructors and Destructors

代码解释

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

摘要

  • C++ 是面向对象的。
  • 类构成了 C++ 面向对象的主要特性。
  • C++ 类将数据和用于操作数据的方法组合成一个整体。
  • 类是对象的蓝图。
  • 类决定了对象的形态。
  • 类中包含的数据和方法称为类成员。
  • 要访问类成员,您应该使用类的实例。
  • 要创建一个类,我们使用 `class` 关键字。
  • 类成员函数可以在类内部或类外部定义。