[C++ 潜心修炼]送对象啦
Posted 一个正直的男孩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[C++ 潜心修炼]送对象啦相关的知识,希望对你有一定的参考价值。
要对象吗,摸起来滑滑的那种
类和对象的基本概念
对象:
大家知道C语言是面向过程的,而C++是面向对象的,那么啥是面向过程,啥是面向对象呢?
- 面向过程:
最近觉得自己王者荣耀段位太低了去找了个代练app,下单,看app是如何给我找人,代练如何的人是如何打游戏的呀,哦打完了要结算了,你每一个步骤,每个细节都要了解
- 面向对象
依旧是上面的例子,代练app下单,app分配打单人,打完结算,你不需要知道代app是如何找到代练,代练是如何打上去的,你只需要交钱即可
通俗来讲机会说,面向过程需要你一个一个的调用,而对象则是把全部封装在了一起也就是 “类”
类
其实就是C的结构体plus,结构体是不同变量元素的集合,C++的类在此基础上加了些新东西如:可以直接使用类型名
,在结构体内定义声明
(准确的说是类,到C++中struct变成了类),加了访问限定符……
struct Data
{
int ADD(int a ,int b);//结构体内声明函数
int _year;
int _month;
int _day;
Data*next;//直接使用类型名创建
};
虽然struct好用但是为了和C区分一下(个人观点)就搞了class来定义类,他们俩本质上有点区别一个默认是公开一个是私有(下文讲述)
如果你在函数中定义了函数那么他就是内联函数
访问限定符
假设有一个妹子巨可爱,且没有男朋友那么他就公开的,有天你鼓足勇气追她然后成功那么她就是私有的咯
代码
class Friend
{
public:
int girl;
private:
int bieauty_girl;
}
int main()
{
Girl I.bieauty_girl;//不可以访问
I.girl;//可以直接访问
}
你想怎么行我一定要鱼和熊掌都兼得,那么办呢?那只能这样
class Friend
{
public:
void boyfriend()//类中的成员可以访问
{
cout<<bieauty_gir<<endl;
}
int girl;
private:
int bieauty_girl;
}
int main()
{
Girl I.bieauty_girl;//不可以访问
I.girl;//可以直接访问
}
上述提到struct和clas的区别是一个是默认公开另一个是私有且C++是支持C语言的编译器的,那么就是说如果stuct默认是私有那么我用C的方式写是编译不过的
类的存储
那么类是如何存的呢?他其实和结构体一样计算的,那么下面的类大小是多少?
class Date
{
public:
void Print();//4
int Add();//4
private:
int _year;//4
int _month;//4
int _day;//4
};
你是否被我迷惑了呢,或者你开始就这样想的,3 个变量 12bit,函数应该是存他的地址,那就是 8bit,然后最大对齐数是4,20?
虽然不是,但可能猜出来,函数不算在类中,你想变量是不同
的哟(定义了对象后里面的参数不同),但是函数是相同的呀,所以这些函数被放到公共代码段,用的时候直接去公共代码段找就可以了
this指针
来看看这段代码
我没传传指针但还是把数据打印出来,为啥?这儿其实是传了,但编译器不显示你每次调用函数的时候会隐式的传地址,并用一个this指针接收如图所示
看到都打印出来了,是不是他是隐藏的,但是他也可以和👆一样显示其实都一样,作用在后面的STL会体现出来
this的存储
那么this指针是存在哪的呢?静态区,或者栈?
他是存在栈上的,你看他是不是函数的参数,虽然他是隐式的,只要是函数的参数那么就是临时开辟的就存在栈上,且他也不存在类中
const修饰this
那么其实有时候你不想让本类的数据修改哪咋办呢??其实const也是修饰this指针的,可是他不是隐藏起来了吗,咋修饰呢?
他在末尾加了一个const表示是对象是const的
- 一般来说如果你觉得不会修改那么最好const修饰他如Print,那就不会遇到误赋值的问题
2. 权限可以被缩小但不可以被放大,也就是说你可以把非const修饰的对象传给const,但是你不可以把const对象传给一个普通对象,还是那句话,权限可以被缩小,但不可以被放大
类实例化
其实你可以猜出来,是函实例化就是创建对象,这里和C语言结构体一样,你看类就是在结构体的基础上开发的,定义结构体就是在画蓝图,拿结构体创建对象也就是造房子,类也是一样。
以上是关于[C++ 潜心修炼]送对象啦的主要内容,如果未能解决你的问题,请参考以下文章