企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
#### 21. 类 & 对象 C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型。 类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。 **类定义:** 定义一个类,本质上是定义一个数据类型的蓝图。这实际上并没有定义任何数据,但它定义了类的名称意味着什么,也就是说,它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作。 类定义是以关键字 **class** 开头,后跟类的名称。类的主体是包含在一对花括号中。类定义后必须跟着一个分号或一个声明列表。例如,我们创建一个 \*.h 文件 使用关键字 **class** 定义 Person 数据类型,如下所示: ~~~ //定义了一个 Person ,跟 Java class 差不多 class Person { public: //公共的属性 Person(); //空参 ~Person(); //Person 销毁执行 Person(char *name, char *gen, int age); //有参构造 //成员变量 char *name; char *gen; int age; //函数 void setName(char *name); char *getName(); void setGen(char *gen); char *getGen(); void setAge(int age); int getAge(); }; 复制代码 ~~~ 关键字 **public** 确定了类成员的访问属性。在类对象作用域内,公共成员在类的外部是可访问的。您也可以指定类的成员为 **private** 或 **protected**。 **定义 C++ 对象:** 类提供了对象的蓝图,所以基本上,对象是根据类来创建的。声明类的对象,就像声明基本类型的变量一样。下面的语句声明了类 Person的两个对象: ~~~ Person personTemp;//声明 personTemp 类型为 Person 复制代码 ~~~ **访问数据成员:** 类的对象的公共数据成员可以使用直接成员访问运算符 (.) 来访问。为了更好地理解这些概念,让我们尝试一下下面的实例: ~~~ //1. person.h 文件中定义 Person 对象 //定义了一个 Person ,跟 Java class 差不多 class Person { public: //公共的属性 Person(); ~Person(); Person(char *name, char *gen, int age); char *name; char *gen; int age; void setName(char *name); char *getName(); void setGen(char *gen); char *getGen(); void setAge(int age); int getAge(); }; //2. person.cpp Person::Person(char *name, char *gen, int age) { this->name = name; this->age = age; this->gen = gen; } Person::~Person() { cout << "Person 销毁" << endl; } Person::Person() { cout << "执行 Person 空参构造函数" << endl; } void Person::setAge(int age) { this->age = age; } void Person::setName(char *name) { this->name = name; } void Person::setGen(char *gen) { this->gen = gen; } char *Person::getName() { cout << "DevYK getName" << endl; return this->name; } char *Person::getGen() { return this->gen; } int Person::getAge() { return this->age; } //3. 测试 void test19() { //栈里面定义的当该方法执行完就会回收掉 Person 对象 Person personTemp; personTemp.setGen("男"); personTemp.setName("小明"); personTemp.setAge(18); cout << personTemp.getName() << "\t" << personTemp.getGen() << "\t" << personTemp.getAge() << endl; //初始化 Person 对象,在堆内存中,如果不主动清理 那么就会造成 内存泄漏 Person *person = new Person("DevYK", "男", 28); cout << person->getName() << "\t" << person->getGen() << "\t" << person->getAge() << endl; //释放 person 堆内存 delete person; } 复制代码 ~~~ > **输出:** > > 执行 Person 空参构造函数 小明 男 18 DevYK 男 28 Person 销毁 Person 销毁 需要注意的是,私有的成员和受保护的成员不能使用直接成员访问运算符 (.) 来直接访问。我们将在后续的教程中学习如何访问私有成员和受保护的成员。 **类 & 对象详解:** 到目前为止,我们已经对 C++ 的类和对象有了基本的了解。下面的列表中还列出了其他一些 C++ 类和对象相关的概念,可以点击相应的链接进行学习。 | 概念 | 描述 | | --- | --- | | [类成员函数](https://www.runoob.com/cplusplus/cpp-class-member-functions.html) | 类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。 | | [类访问修饰符](https://www.runoob.com/cplusplus/cpp-class-access-modifiers.html) | 类成员可以被定义为 public、private 或 protected。默认情况下是定义为 private。 | | [构造函数 & 析构函数](https://www.runoob.com/cplusplus/cpp-constructor-destructor.html) | 类的构造函数是一种特殊的函数,在创建一个新的对象时调用。类的析构函数也是一种特殊的函数,在删除所创建的对象时调用。 | | [C++ 拷贝构造函数](https://www.runoob.com/cplusplus/cpp-copy-constructor.html) | 拷贝构造函数,是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。 | | [C++ 友元函数](https://www.runoob.com/cplusplus/cpp-friend-functions.html) | **友元函数**可以访问类的 private 和 protected 成员。 | | [C++ 内联函数](https://www.runoob.com/cplusplus/cpp-inline-functions.html) | 通过内联函数,编译器试图在调用函数的地方扩展函数体中的代码。 | | [C++ 中的 this 指针](https://www.runoob.com/cplusplus/cpp-this-pointer.html) | 每个对象都有一个特殊的指针 **this**,它指向对象本身。 | | [C++ 中指向类的指针](https://www.runoob.com/cplusplus/cpp-pointer-to-class.html) | 指向类的指针方式如同指向结构的指针。实际上,类可以看成是一个带有函数的结构。 | | [C++ 类的静态成员](https://www.runoob.com/cplusplus/cpp-static-members.html) | 类的数据成员和函数成员都可以被声明为静态的。 |