C++ —— 关于类和对象(上)
1.类的定义格式
1. class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。
class Stack { }
类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数,class关键字定义与结构体非常类似,只不过是比结构体能多定义一个方法 / 成员函数
2. 为了区分成员变量,⼀般习惯上成员变量会加一个特殊标识,如成员变量前面或者后面加_ 或者 m开头,注意C++中这个并不是强制的,只是⼀些惯例,具体看公司的要求
class zjh { public: void Init(int year, int month, int day) { _year = year; _month = month; _day = day; } };
class zjh { private: int _year; // year_ m_year int _month; int _day; };
成员变量只要定义在类里面就可以,没有其他限制
3. C++中struct也可以定义类,C++兼容C中struct的用法,同时struct升级成了类,明显的变化是
struct中可以定义函数,⼀般情况下我们还是推荐用class定义类
Struct zjh { public: void Init(int year, int month, int day) { _year = year; _month = month; _day = day; } };
class与struct的区别是 :class的默认访问限定符是私有的,而struct的默认访问限定符是公有的
4. 定义在类里面的成员函数默认为inline(内联函数)
2.访问限定符
1. C++⼀种实现封装的方式,用类将对象的属性与方法结合在⼀块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用
2. public(公有)修饰的成员在类外可以直接被访问;protected和private(受保护的/私有)修饰的成员在类外不能直接被访问,protected和private是⼀样的,以后继承章节才能体现出他们的区别。
3. 访问权限作用域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为止,如果后面没有访问限定符,作用域就到 }即类结束。
#include using namespace std; class Stack { //公有 public: // 成员函数 void Init(int n = 4); int a = 0; //私有 private: // 成员变量 int* array; size_t capacity; size_t top; };
上面的代码的访问权限作用域就是从 public到private之间的距离,如果没有private的话那么此代码的访问权限作用域就是从public到}结束
4. class定义成员没有被访问限定符修饰时默认为private(私有),struct默认为public(公有)
5. ⼀般成员变量都会被限制为private/protected(私有/受保护的),需要给别⼈使用的成员函数会放为public(公有)
6.访问限定符可以出现多次,但是实际中一般只会出现一对public和private
3.类域
1. 类定义了⼀个新的作用域,类的所有成员都在类的作用域中,在类体外定义成员时,需要使⽤ :: 作用域操作符指明成员属于哪个类域
2. 类域影响的是编译的查找规则,下面程序中Init如果不指定类域Stack,那么编译器就把Init当成全局函数,那么编译时,找不到array等成员的声明/定义在哪里,就会报错
指定类域Stack,就是知道Init是成员函数,当前域找不到的array等成员,就会到类域中去查找
// 声明和定义分离,需要指定类域 void Stack::kiana { int a = 12; } int main() { st.kiana(); return 0; }
4.类的实例化
1. 用类类型在物理内存中创建对象的过程,称为类实例化出对象
2. 类是对象进行⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只是声明,没有分配空间,⽤类实例化出对象时,才会分配空间
3. ⼀个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
打个比方:类实例化出对象就像现实中使⽤建筑设计图建造出房子,类就像是设计图,设计图规划了有多少个房间,房间大小功能等,但是并没有实体的建筑存在,也不能住人,用设计图修建出房子,房子才能住⼈。同样类就像设计图⼀样,不能存储数据,实例化出的对象分配物理内存存储数据
#include using namespace std; class Date { public: void Init(int year, int month, int day) { _year = year; _month = month; _day = day; } void Print() { cout