<<零基础学C++,类和对象(上)--类的定义,访问限定符,类域,实例化>>
目录
类的定义
访问限定符
类域
实例化
实例化的概念
类的定义
class为定义类的关键字,Date为类的名字(类名就相当于类型),{ }中为类的主体,注意类定义结束时后⾯分号不能省 略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。
为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m 开头,注意C++中这个并不是强制的,只是⼀些惯例,具体看公司的要求。
class Date
{
//成员函数
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
//成员变量
// 为了区分成员变量,⼀般习惯上成员变量
// 会加⼀个特殊标识,如_ 或者 m开头
int _year;
int _month;
int _day;
};
C++中struct也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是 struct中可以定义函数,⼀般情况下我们还是推荐⽤class定义类
//ListNodecpp就代表类形
struct ListNodecpp
{
void Init(int x)
{
next = nullptr;
val = x;
}
ListNodecpp* next;
int val;
};
定义在类⾯的成员函数默认为inline。
访问限定符
C++⼀种实现封装的⽅式,⽤类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限 选择性的将其接⼝提供给外部的⽤户使⽤。
public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访 问,protected和private是⼀样的,以后继承章节才能体现出他们的区别。
⼀般成员变量都会被限制为private/protected,需要给别⼈使⽤的成员函数会放为public
class Date
{
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
问题与解答:
问题:C++中struct也变成了类,那么和class有什么区别?
解答:class定义成员没有被访问限定符修饰时默认为private,struct默认为public
问题:C++为什么要设置私有、公有?
解答:首先,C语言对程序员的素质要求极高,这是因为C语言比较自由,既可以通过函数访问,也可以直接去访问。自由也意味着混乱。
//注意初始化
void STInit(ST* ps)
{
assert(ps);
ps->a = NULL;
ps->top = 0;
ps->capacity = 0;
}
//通过函数取顶部元素
STDataType STTop(ST* ps)
{
assert(ps);
return ps->a[ps->top - 1];
}
//直接取顶部元素,但要注意初始化,容易出错
ST st1;
STInit(&st1);
int top = st1.a[st1.top]; //[st1.top - 1] 才是正确的顶部元素
类域
类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中,在类体外定义成员时,需要使⽤ :: 作 ⽤域操作符指明成员属于哪个类域
类域影响的是编译的查找规则,当声明和定义分开写时,要加上类域,这样就会在类域里查找。如果不加上类域,那么编译器就把Init当成全 局函数,那么编译时,找不到array等成员的声明/定义在哪⾥,就会报错。
//Stack.h
class Stack
{
public:
//缺省参数写在函数声明里
void Init(int n = 4);
private:
int* arry;
size_t top;
size_t capacity;
};
//Stack.cpp
//声明和定义分离需要指定类域
void Stack::Init(int n)
{
arry = (int*)malloc(n * sizeof(int));
if (arry == nullptr)
{
perror("malloc fail");
return;
}
top = 0;
capacity = n;
}
实例化
实例化的概念
定义出来的类相当于图纸,用类创建对象的过程,成为实例化对象。
类是对象进⾏⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只 是声明,没有分配空间,⽤类实例化出对象时,才会分配空间。
⼀个类可以实例化出多个对象,实例化出的对象占⽤实际的物理空间,存储类成员变量。打个⽐ ⽅:类实例化出对象就像现实中使⽤建筑设计图建造出房⼦,类就像是设计图,设计图规划了有多 少个房间,房间⼤⼩功能等,但是并没有实体的建筑存在,也不能住⼈,⽤设计图修建出房⼦,房 ⼦才能住⼈。同样类就像设计图⼀样,不能存储数据,实例化出的对象分配物理内存存储数据。
class Date
{
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private:
//这里只是声明,没有开空间
int _year;
int _month;
int _day;
};
int main()
{
//实例化对象才分配内存
Date d1;
return 0;
}