(1)class为定义类的关键字,stack为类的名字,{ }为类的主体。注意类定义结束时后面分号不能省略。类体中内容成为类的成员:类的成员变量成为类的属性或成员变量;类中的函数称为类的方法或成员函数。
类定义的语法:
//类的定义语法:
class stack
{
};
(2)为了区分成员变量,一般习惯上成员变量会加一个标识,如:成员变量前面或者后面加_或者m开头。注意:C++中这个并不是强制的,知识一些惯例。
例如:
class person
{
public:
int m_age;
int m_height;
};
(3)C++中struct也可以定义类,C++兼容C中struct的用法,同时struct升级为了类,明显的变化是:struct中可以定义函数,一般情况下,推荐用class定义类。
示例:
struct date
{
public:
void init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
C++中的结构体与C中的结构体对比:
C中的结构体:
由此可知在C语言中结构体中使用结构体,必须加上关键字:struct;
而在C++中结构体中使用结构体可以把关键字struct省略:
#include
using namespace std;
struct person
{
person* p;
};
int main()
{
person a;
return 0;
}
(1)C++一种实现封装的方式,用类将对象的属性与方法结合在一起,让对象更加完善,通过访问权限选择性的将其函数提供给外部的函数使用。
(2)public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访问。
(3)访问权限作用域是从该访问限定符出现的位置开始下一个访问限定符出现时为止。如果后面没有访问限定符,作用域就到}即类结束。
示例:
(4)一般成员变量都会被限制为private/protected;需要给别人使用的成员函数会改为:public。
(5)class定义成员(即成员函数、成语变量)时,没有被访问限定符修饰时,默认为:private,struct默认为public
注意事项:
若一个类的成员函数被public修饰,则该成员函数可以在类中声明,在类外定义,此时要用到域作用限定符::和类名。
示例:
class date
{
public:
void Init(int year, int month, int day);//在类中声明
private:
int _year;
int _month;
int _day;
};
void date::Init(int year,int month,int day)
{
_year = year;
_month = month;
_day = day;
}
同一域中不能定义同名变量,在不同的域中,可以定义同名的变量。
(1)类定义了一个新的作用域,类的所有成员都在类的作用域中,在类体外使用类中的成员时,需要使用::域作用操作符指明成员属于哪个类域。
(2)类域影响的是编译的查找规则,下面程序中Init如果不指定类域stack,那么编译器就把Init当成全局函数,那么编译时,找不到array等成员的声明/定义在哪里,就会报错。指定类域stack,就是知道Init是成员函数,当前域找不到的array等成员,就会到类域中查找。
示例:
#include
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;
}