[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
{

publicint girl;
privateint bieauty_girl;
}
int main()
{ 
   Girl I.bieauty_girl;//不可以访问
   I.girl;//可以直接访问

}

你想怎么行我一定要鱼和熊掌都兼得,那么办呢?那只能这样

class Friend
{

publicvoid boyfriend()//类中的成员可以访问
{
   cout<<bieauty_gir<<endl;
}
int girl;
privateint 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的

  1.       一般来说如果你觉得不会修改那么最好const修饰他如Print,那就不会遇到误赋值的问题

2.      权限可以被缩小但不可以被放大,也就是说你可以把非const修饰的对象传给const,但是你不可以把const对象传给一个普通对象,还是那句话,权限可以被缩小,但不可以被放大



类实例化

      其实你可以猜出来,是函实例化就是创建对象,这里和C语言结构体一样,你看类就是在结构体的基础上开发的,定义结构体就是在画蓝图,拿结构体创建对象也就是造房子,类也是一样。

以上是关于[C++ 潜心修炼]送对象啦的主要内容,如果未能解决你的问题,请参考以下文章

[C++潜心修炼] 模版与泛型编程

[C++ 潜心修炼]

[C++潜心修炼] 小试牛刀

[C++潜心修炼] operator重载

[C++ 潜心修炼] 一块敲门砖

Python自动化测试 开始招生啦