持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情
前言
本文就来分享一波笔者对于C++类和对象初阶的学习经验和心得,还有续文。
笔者水平有限,难免存在纰漏,欢迎指正交流。
类和对象
面向过程和面向对象初步认识
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 比如我们要洗衣服,整个洗衣服的过程要分解为几个子过程来完成。
而C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。还是洗衣服的例子。
类的引入
铺垫
C语言结构体中只能定义成员变量,而在C++中,结构体内不仅可以定义成员变量,也可以定义成员函数。其实最初是将结构体改进后使用的,后面才单独抽离出类这一概念,可以说结构体是类的前身。而且结构体是一种自定义类型,类也是一种自定义类型,只不过结构体实例化得到的是变量,而类实例化得到的是对象。
所以说在C++中,结构体具有类的功能特性,同时保留了C中的用法和特性(兼容C)。
举个例子先瞅瞅
typedef int DataType;
struct Stack
{
//成员变量
DataType* _array;
size_t _capacity;
size_t _size;
//成员函数
void Init(size_t capacity)
{
//C++的类中成员变量可以在成员函数中直接使用
_array = (DataType*)malloc(sizeof(DataType) * capacity);
if (nullptr == _array)
{
perror("malloc申请空间失败");
return;
}
_capacity = capacity;
_size = 0;
}
void Destroy()
{
if (_array)
{
free(_array);
_array = nullptr;
_capacity = 0;
_size = 0;
}
}
};
int main()
{
Stack s;//C++的类可以直接用类名来创建对象
s.Init(10);//C++的对象可以使用对应类中的函数
s.Destroy();
return 0;
}
类简介
类是定义出来的一种数据类型。要定义类,需要描述它能够表示什么信息和可对数据执行哪些操作。类之于对象就像类型之于变量。类定义描述了一种数据类型的全部属性和可使用它执行的操作,对象就是根据这些描述创建的实体。
类的定义
class className
{
// 类体:由成员函数和成员变量组成,成员函数集中在一起,成员变量集中在一起
}; // 一定要注意后面的分号
class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。 类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。 类的两种定义方式:
- 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
- 类声明放在.h文件中,成员函数定义放在.cpp文件中,讲究一个声明和定义分离,以此来提高可读性(如果函数有很多不方便查找和阅读时,函数声明简短并且能快速了解函数功能和用法)以及安全性(可以不提供函数实现细节而只提供接口),注意:成员函数名前需要加 类名和:: 来指定。
因为类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。
类里面成员函数和成员变量谁在上谁在下都可以,没有区别,因为类被认为是一个整体,查找成员变量的时候会在整个类里查找。
比如此时成员变量在成员函数下面也没问题:
typedef int DataType;
struct Stack
{
//成员函数
void Init(size_t capacity)
{
//C++的类中成员变量可以在成员函数中直接使用
_array = (DataType*)malloc(sizeof(DataType) * capacity);
if (nullptr == _array)
{
perror("malloc申请空间失败");
return;
}
_capacity = capacity;
_size = 0;
}
void Destroy()
{
if (_array)
{
free(_array);
_array = nullptr;
_capacity = 0;
_size = 0;
}
}
//成员变量
DataType* _array;
size_t _capacity;
size_t _size;
};
关于成员变量命名规则:
// 我们看看这个函数,是不是有点怪?
class Date
{
public:
void Init(int year)
{
// 这里的year到底是成员变量,还是函数形参?
year = year;
}
private:
int year;
};
// 所以一般都建议这样
class Date
{
public:
void Init(int year)
{
_year = year;
}
private:
int _year;
};
// 或者这样
class Date
{
public:
void Init(int year)
{
mYear = year;
}
private:
int mYear;
};
// 一般都是加个前缀或者后缀标识区分就行,这点主要看公司要求。
//用限定符::指定变量或者this指针也是可以的,只不过修改标识符更方便。
类的访问限定符及封装
访问限定符
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
【访问限定符说明】
- public修饰的成员在类外可以直接被访问
- protected和private修饰的成员在类外不能直接被访问(在此处先认为protected和private是一样作用的)
- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
- 如果后面没有访问限定符,作用域就到 } 即类结束。
- class的默认访问权限为private,struct为public(因为struct要兼容C)
比如:
typedef int DataType;
struct Stack
{
private:
//成员变量
DataType* _array;
size_t _capacity;
size_t _size;
public:
//成员函数
void Init(size_t capacity = 4)
{
//C++的类中成员变量可以在成员函数中直接使用
_array = (DataType*)malloc(sizeof(DataType) * capacity);
if (nullptr == _array)
{
perror("malloc申请空间失败");
return;
}
//类里面可以访问成员变量,原因后面会介绍
_capacity = capacity;
_size = 0;
}
void Destroy()
{
if (_array)
{
free(_array);
_array = nullptr;
_capacity = 0;
_size = 0;
}
}
};
int main()
{
Stack st;
st.Init();
st._size = 0;//编译器会报错,类外面无法访问private成员
st.Destroy();
return 0;
}
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别!
一个问题
C++中struct和class的区别是什么?
解答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来定义类,和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类默认访问权限是private。
注意:在继承和模板参数列表位置,struct和class也有区别,后续文章再介绍。
以上就是本文全部内容,感谢观看,你的支持就是对我最大的鼓励~