C++学习之类与对象
经过C++入门的学习后,可能各位读者大大对于C++语法部分的内容仍然有一些困惑,但是没关系,经过后面的学习我们会对前面的内容有更好的了解。
在本篇文章中,我们会学习C++的另一个重要的部分——类与对象。
类的定义
类定义的格式
class为定义类的关键字,Stack为类的名字,{}中为类的主题,注意类定义结束时后面分号不能省略(与C中的结构体变量)。类体中内容称之为类的成员;类中的变量称之为类的属性或成员变量;类的函数称之为类的方法或者成员函数。
为了区分成员变量,一般习惯上成员变量会加上一个特殊标识,比如成员变量前面或后面加_或者_m等。这并不是C++的规定,具体看项目组和公司的要求。
C++中struct也可以定义为类。C++兼容struct的用法,同时struct也升级为了类,很明显的变化是struct也可以定义函数。(不过我们推荐用class定义类)
定义在类中的成员函数默认为inline
下面就是一个定义类的结构示例
class stack
{//成员变量int x;int arr[100];//成员函数void init(){//code}
};
访问限定符
C++一种实现封装的方式就是用类将对象的属性和方法结合到一起,让对象更加完善,通过访问权限接口选择性的将其接口提供给外部函数使用。
public修饰的成员在类外可以直接访问;protected和private修饰的成员在类外不能直接被访问。在目前的章节我们认为protected和private,后续的学习才能体现出它们的区别。
访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现位置,如果后面没有访问限定符,作用域就到},即类结束。
下图中两段代码是等效的。
class定义成员没有被访问限定符修饰的时候默认为private,struct默认为public。
举例说明:下图两段代码等效
且结果相同
一般成员函数变量都会被限制为private/protected,需要给别人使用的成员函数会放为public。
定义在类里面的函数就是内联函数。
类域
在C++入门C++学习记录:C++入门-CSDN博客的命名空间片段中我们知道类域属于命名空间的一部分,接下来我们将就类域进行详细地叙述。
目前我们知道的有四个域:局部域全局域、类域和命名空间域。命名空间域和类域不影响声明周期,只解决各自命名冲突(类域解决互相之间的命名冲突,命名空间域解决全局的命名冲突)
类定义了一个新的作用域,类的所有成员都在类的作用域中,在类体外定义成员的时候,需要使用::作用域操作符指明成员属于哪个类域
如果声明与定义分离,可以按如下方式去指定的类域寻找init函数,在预处理处包含<stack.h>(举例说明的)
如果声明与定义分离,可以按如下方式去指定的类域寻找init函数,在预处理处包含<stack.h>(举例说明的)
void stack::init();//去指定的类域中寻找init函数
类域解决了类与类之间的命名冲突。命名空间域是解决全局空间的函数/变量/类型的命名冲突。
类域影响的是编译的查找规则。比如在下图的程序中init如果不指定类域stack,那么编译器就会把init当成全局函数,那么编译时,找不到array等成员的声明/定义在哪里,就会报错。指定类域stack,就是知道init是成员函数,如果当前域找不到,就回去类域当中寻找
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class stack
{
public://成员函数void init(int n = 4);
private://成员变量int* array;size_t capacity;size_t top;
};
void stack::init(int n)
{array = (int*)malloc(sizeof(int) * n);if(nullptr == array){perror("malloc申请空间失败");return;}capacity = n;top = 0;
}int main()
{stack st;st.init();return 0;
}