C++ 类与对象及示例
什么是类?
C++ 类将数据和用于操作数据的方法组合成一个整体。类还决定了对象的形态。类中包含的数据和方法称为类成员。类是用户定义的数据类型。要访问类成员,我们需要使用类的实例。您可以将类视为对象的蓝图。
类可以是一个房屋的原型。它展示了门、窗、地板等的.位置和大小。根据这些描述,我们可以建造一栋房子。这栋房子就成了对象。可以从原型建造许多房子。同样,也可以从一个类创建许多对象。
在上图中,我们有一个房屋原型。基于此原型,我们创建了两栋具有不同特征的房屋。
类声明
在 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; }
输出
这是代码的屏幕截图:
代码解释:
- 在代码中包含 iostream 头文件以使用其函数。
- 在代码中包含 std 命名空间,以便在不调用其名称的情况下使用其类。
- 声明一个名为 Phone 的类。
- 使用 public 访问修饰符将我们要创建的变量标记为公共可访问。
- 声明一个 double 类型的变量 cost。
- 声明一个名为 slots 的整数变量。
- 类主体的结束。
- 调用 main() 函数。程序逻辑应添加到其主体中。
- 创建名为 Y6 的 Phone 类型对象。这称为实例化。
- 创建名为 Y7 的 Phone 类型对象。这称为实例化。
- 使用对象 Y6 访问类 Phone 的变量/成员 cost。值设置为 100.0。Y6 的 cost 现在设置为 100.0。
- 使用对象 Y6 访问类 Phone 的变量/成员 slots。值设置为 2。Y6 的 slots 现在设置为 2。
- 使用对象 Y7 访问类 Phone 的变量/成员 cost。值设置为 200.0。Y7 的 cost 现在设置为 200.0。
- 使用对象 Y7 访问类 Phone 的变量/成员 slots。值设置为 2。Y7 的 slots 现在设置为 2。
- 在控制台打印 Y6 的 cost 以及其他文本。
- 在控制台打印 Y7 的 cost 以及其他文本。
- 在控制台打印 Y6 的 slots 数量以及其他文本。
- 在控制台打印 Y7 的 slots 数量以及其他文本。
- 程序在成功完成后必须返回值。
- 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; }
输出
这是代码的屏幕截图:
代码解释
- 包含 iostream 头文件到我们的代码中以使用其函数。
- 包含 std 命名空间到我们的代码中以使用其类而无需调用其名称。
- 创建一个名为 ClassA 的类。
- 使用 public 访问修饰符将要创建的类成员标记为公共可访问。
- 创建名为 set_a() 的函数,该函数接受一个整数值 val。
- 创建名为 get_a() 的函数。
- 使用 private 访问修饰符将要创建的类成员标记为私有可访问。
- 声明一个名为 a 的整数变量。
- 类主体的结束。
- 使用类名和作用域解析运算符访问 get_a() 函数。我们想定义调用该函数时会发生什么。
- get_a() 函数在被调用时应返回变量 a 的值。
- get_a() 函数定义的结束。
- 使用类名和作用域解析运算符访问 set_a() 函数。我们想定义调用该函数时会发生什么。
- 将变量 val 的值赋给变量 a。
- set_a() 函数定义的结束。
- 调用 main() 函数。程序逻辑应添加到此函数的主体中。
- 创建 ClassA 的一个实例并命名为 a。
- 使用上述类实例和 set_a() 函数将值 20 赋给变量 a。
- 在控制台上打印一些文本以及变量 a 的值。变量 a 的值是通过调用 get_a() 函数获得的。
- 程序在成功完成后应返回值。
- 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; }
输出
这是代码的屏幕截图:
代码解释
- 包含 iostream 头文件到我们的代码中以使用其函数。
- 包含 std 命名空间到我们的代码中以使用其类而无需调用其名称。
- 创建一个名为 ParentClass 的类。
- 使用 protected 访问修饰符将要创建的类成员标记为 protected。
- 创建一个名为 value 的整数变量。
- 类主体的结束。
- 创建一个名为 ChildClass 的新类,它继承自 ParentClass。
- 使用 protected 访问修饰符将要创建的类成员标记为对子类可访问。
- 创建名为 setId() 的函数,该函数接受一个整数值 x。
- 将变量 x 的值赋给变量 value。
- setId() 函数定义的结束。
- 创建一个名为 displayValue() 的函数。
- 在控制台打印名为 value 的变量的值以及其他文本。
- displayValue() 函数主体的结束。
- 名为 ChildClass 的类的.主体的结束。
- 调用 main() 函数。程序逻辑应添加到此函数的主体中。
- 创建 ChildClass 的一个实例并命名为 c。
- 使用上述类实例和 setId() 函数将值 21 赋给变量 x。
- 使用上述类实例调用名为 displayValue() 的函数。
- 程序在成功完成后应返回值。
- 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; }
输出
这是代码的屏幕截图:
代码解释
- 将 iostream 头文件包含到我们的程序中以使用其函数。
- 将 string 头文件包含到我们的程序中以使用其函数。
- 包含 std 命名空间到我们的代码中以使用其类而无需调用其名称。
- 创建一个名为 Guru99 的类。
- 使用 public 访问修饰符将我们即将创建的类成员标记为公共可访问。
- 创建一个名为 tutorial_name 的 string 变量。
- 创建一个名为 id 的整数变量。
- 创建一个名为 printname() 的函数。该函数未在类定义中定义。
- 创建一个名为 printed() 的函数。该函数在类定义中定义。其主体已添加到类定义中。
- 在控制台上打印变量 id 的值以及其他文本。注意,这已添加到 printid() 函数的主体中。它仅在调用 printid() 函数时执行。
- printid() 函数主体的结束。
- Guru99 类的.主体的结束。
- printname() 函数定义的开始。
- 在控制台上打印变量 tutorial_name 的值以及其他文本。注意,这已添加到 printname() 函数的主体中。它仅在调用 printname() 函数时执行。
- printname() 函数定义的结束。
- 调用 main() 函数。程序逻辑应添加到此函数的主体中。
- 创建 Guru99 类的实例并命名为 guru99。
- 使用上述实例将值 C++ 赋给变量 tutorial_name。
- 使用 guru99 实例将值 1001 赋给变量 id。
- 使用实例 guru99 调用 printname() 函数。
- 调用 end (end line) 命令在控制台打印一个新空行。
- 使用实例 guru99 调用 printid() 函数。
- 程序在成功完成后应返回值。
- 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; } }
输出
这是代码的屏幕截图:
代码解释
- 将 iostream 头文件包含到代码中以使用其函数。
- 包含 std 命名空间到我们的代码中以使用其类而无需调用其名称。
- 创建一个名为 ClassA 的类。
- 使用 public 访问修饰符将我们要创建的成员标记为公共可访问。
- 为类创建一个构造函数。
- 构造函数被调用时在控制台打印的文本。endl 是 C++ 关键字,表示 end line(换行)。它将光标移动到下一行。
- 类构造函数主体的结束。
- 为类创建一个析构函数。
- 析构函数被调用时在控制台打印的文本。endl 是 C++ 关键字,表示 end line(换行)。它将光标移动到下一行。
- 析构函数主体的结束。
- 类主体的结束。
- 调用 main() 函数。程序逻辑应添加到此函数的主体中。
- 创建一个类对象并命名为 a。此时将调用构造函数。
- 创建一个名为 p 的整数变量并将值 1 赋给它。
- 使用变量 p 创建一个 if 语句块。
- 创建一个类对象并命名为 b。此时将调用析构函数。
- if 语句主体的结束。
- main() 函数体结束。
摘要
- C++ 是面向对象的。
- 类构成了 C++ 面向对象的主要特性。
- C++ 类将数据和用于操作数据的方法组合成一个整体。
- 类是对象的蓝图。
- 类决定了对象的形态。
- 类中包含的数据和方法称为类成员。
- 要访问类成员,您应该使用类的实例。
- 要创建一个类,我们使用 `class` 关键字。
- 类成员函数可以在类内部或类外部定义。