前言
Hello,友友们,好久不见啦,前面将C++的基本知识了解了一下,今天将学习C++的另一知识,类与对象的学习,学习起来稍有难度哦!!!
1.类的定义
类(Class)
类是一个抽象的概念,它定义了一组具有相同属性(attribute)和方法(method)的对象的模板。类为创建对象提供了蓝图。在类中,你可以定义以下内容:
- 属性(Attributes):变量,用于存储数据。属性可以是类的属性(所有对象共享)或实例属性(每个对象有自己的副本)。
- 方法(Methods):函数,用于定义可执行的操作。方法通常与类的属性交互。
1.1类定义的格式
• class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。
• 为了区分成员变量,一般习惯上成员变量会加一个特殊标识,如成员变量前面或者后面加_ 或者 m开头,注意C++中这个并不是强制的,只是一些惯例。
#include <iostream> using namespace std; class Date{ public: void print(int year, int month, int day) { _year = year; _month = month; _day = day; cout << _year << " " << _month << " " << _day << endl; //cout << year << " " << month << " " << day << endl; } private: // 为了区分成员变量,⼀般习惯上成员变量 // 会加⼀个特殊标识,如_ 或者 m开头 int _year; // year_ m_year int _month; int _day; }; int main() { Date date; date.print(2024, 7, 18); return 0; }
• C++中struct也可以定义类,C++兼容C中struct的用法,同时struct升级成了类,明显的变化是
struct中可以定义函数,⼀般情况下我们还是推荐用class定义类。
#include<iostream> using namespace std; // C++升级struct升级成了类 // 1、类⾥⾯可以定义函数 // 2、struct名称就可以代表类型 // C++兼容C中struct的⽤法 typedef struct ListNodeC { struct ListNodeC* next; int val; }LTNode; // 不再需要typedef,ListNodeCPP就可以代表类型 struct ListNodeCPP { void Init(int x) { next = nullptr; val = x; } ListNodeCPP* next; int val; }; int main() { return 0; }
• 定义在类面的成员函数默认为inline。
1.2访问限定符
• C++一种实现封装的方式,用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
• public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访
问,protected和private是一样的,以后继承章节才能体现出他们的区别。
• 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止,如果后面没有访问限定符,作用域就到 }即类结束。
• class定义成员没有被访问限定符修饰时默认为private,struct默认为public。
• 一般成员变量都会被限制为private/protected,需要给别人使用的成员函数会放为public。
1.3类域
在C++中,每个类定义了自己的作用域。这意味着类的成员(包括数据成员和成员函数)都存在于类的作用域内。当你想要在类的外部引用类的成员时,你需要使用类的作用域解析运算符 `::` 来指明特定的成员属于哪个类。
1.3.1类定义一个作用域
当你定义一个类时,你就创建了一个新的作用域。在这个作用域内,你可以定义变量(数据成员)和函数(成员函数)。
1.3.2类成员在类的作用域中
所有在类定义内部声明的成员都属于该类的作用域。例如:
class MyClass { public: void myFunction(); int myValue; };
在这里,myFunction 和 myValue都是在 MyClass 的作用域中。
1.3.3在类体外定义成员
当需要在类的外部定义成员函数时,需要使用类名和作用域解析运算符 `::` 来指定该函数属于哪个类的作用域。
class MyClass { public: void myFunction(); // 成员函数声明 int myValue; // 数据成员声明 }; // 在类体外定义成员函数 void MyClass::myFunction() { // 函数实现 myValue = 10; // 直接使用类成员 }
在上面的例子中,myFunction 的定义在类 MyClass 的外部。为了指明 myFunction是 MyClass 的成员,我们使用了 MyClass::。
MyClass obj; obj.myFunction(); // 调用成员函数 int value = obj.myValue; // 访问数据成员
2.实例化
2.1实例化概念
• 用类类型在物理内存中创建对象的过程,称为类实例化出对象。
• 类是对象进行一种抽象描述,是一个模型一样的东西,限定了类有哪些成员变量,这些成员变量 只是声明,没有分配空间,用类实例化出对象时,才会分配空间。
• 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量。打个比方:类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,设计图规划了有多少个房间,房间大小功能等,但是并没有实体的建筑存在,也不能住人,用设计图修建出房子,房子才能住人。同样类就像设计图一样,不能存储数据,实例化出的对象分配物理内存存储数据。
#include<iostream> using namespace std; class Date { public: void Init(int year, int month, int day) { _year = year; _month = month; _day = day; } void Print() { cout << _year << "/" << _month << "/" << _day << endl; } private: // 这⾥只是声明,没有开空间 int _year; int _month; int _day; }; int main() { // Date类实例化出对象d1和d2 Date d1; Date d2; d1.Init(2024, 7, 18); d1.Print(); d2.Init(2024, 7, 19); d2.Print(); return 0;
C++之类与对象(1)(下):https://developer.aliyun.com/article/1624933