C++语言类和对象有什么区别

本文探讨了C++中的类和对象的区别,包括它们的创建、内存管理和生命周期。介绍了类的特性,如成员变量的初始化、访问权限、静态成员函数和变量。强调了new运算符在对象创建中的作用,以及在不同场景下使用new的考量。此外,还讨论了构造函数、析构函数、拷贝构造函数以及初始化列表的重要性,并提到了二阶构造模式用于避免半成品对象的问题。最后,指出类和对象是C++中结构体概念的扩展,具有更丰富的特性和功能。
摘要由CSDN通过智能技术生成

起初刚学C++时,很不习惯用new,后来看老外的程序,发现几乎都是使用new,想一想区别也不是太大,但是在大一点的项目设计中,有时候不使用new的确会带来很多问题。当然这都是跟new的用法有关的。new创建类对象,使用完后需使用delete删除,跟申请内存类似。所以,new有时候又不太适合,比如在频繁调用场合,使用局部new类对象就不是个好选择,使用全局类对象或一个经过初始化的全局类指针似乎更加高效。

c++语言类和对象有什么区别_C++知识结构图_C语言_C++对象_课课家教育

  c++的类/对象

  类,是一种特殊的自定义类型,在实例化为对象时,会自动对成员进行初始化

  1.类/对象的一些特性

  对象的创建细节

  当一个类实例化为一个对象时,会为其中的成员分配内存空间(所有成员默认private)。其中,成员变量集中放在对象的内存中(就和结构体一样),而成员函数是同一个类的所有对象公用的,单独定义在代码段,并不以函数指针的形式放在对象的内存中,由编译器在编译时直接链接到调用处

  然后编译器连它们的初始化都给包办了,自动进行赋值,编译器先执行初始化列表,再执行构造函数,来为成员变量赋初始值

  所以可以认为,从同个类中实例化而来的对象,它们的成员函数实质是同一个函数(入口地址相同)。那么问题来了,众所周知,成员函数可以直接访问成员变量,但是从同个类中实例化而来的对象,其成员函数如何区分自己和别人的成员变量呢?答案是隐藏的参数“this”,this的本质是一个指向当前对象自己的指针

  class Test

  {

  int mi;

  public:

  Test(int i){ /*成员函数中隐藏的参数this,Test(int i, this)*/

  mi = i; /*实际执行的是this->mi = i;*/

  };

  };

  int main()

  {/*t1和t2是不同的对象,但同一个类,它们的构造函数Test(int i)实质是同一个函数,那么Test(int i)中如何确定mi是t1.mi还是t2.mi呢?*/

  Test t1(1);

  Test t2(2);

  }1234567891011121314

  成员变量的访问权限

  类中的所有成员默认为private,而成员变量的访问权限一般都应设为private/protected

  private权限范围是当前类(即可被当前类中的成员函数直接获取),protected权限范围是当前类和子类(即可被当前类和子类中的成员函数直接获取)。注意它们的范围是类,而不是对象

  所以说,同一个类的不同对象,它们的成员函数是可以互相访问对方的成员变量的,一般用引用参数来实现:

  class Test

  {

  int var;

  public:

  void Test(const Test &ori)

  {

  cout << ori.var << endl; //可用这种方式直接访问同类的成员变量

  cout << var << endl; //对于自己的成员变量则可直接访问,这的var本质是this —> var

  }

  };

  int main()

  {

  Test t1;

  Test t2;

  t1.test(t2);

  return 0;

  }12345678910111213141516171819

  静态成员函数与成员变量

  静态成员函数与成员变量,它们的性质很类似于普通函数与普通全局变量

  通过前面代码不难得知,成员函数依赖于对象传入的参数“this”,所以只能以对象名.函数名()的形式来调用。如果没有实例化对象,是不能单独去调用成员函数的。如果我们实在要单独调用,则可以使用“静态成员函数”,只需用static修饰成员函数,就可以使它不依赖于对象而被单独调用,可以在任何地方以类名::函数来访问。但是这么做的代价就是,由于没有参数“this”,“静态成员函数”无法访问对象中的成员变量,只能去访问类中公用的成员变量,即“静态成员变量”

  所谓“静态成员变量”,即使用static修饰成员变量,并将其在全局定义。它会被分配到全局数据区,生命周期为永久,所有的对象将共用这个成员变量(类似成员函数的共用)。“静态成员变量”和全局变量唯一不同的是,它可以是private的,相对于全局变量更加安全同时更低耦合高聚态;但是如果设置为public,可以在任何地方以类名::变量名来访问,那就和全局变量没有任何区别了…..

  C++的概念:例如我说“车”的时候,你想到了什么?是不是车子都可以开,都有轮子.那么你头脑中自然就想起了一个车子类(类是属性的集合,车子的属性:可以开,有重量,大小,颜色).但是我说:“你看,那辆车多漂亮!”当你顺着我指着的方向看去,这就是一个实际存在的对象—————具体的车子.综上所述,类是事物的抽象.类的对象就是类的具体化,实际化.有“人"这个类.如果我用 人:张三.那么我就用人这个类去建立了张三这个"人"的对象.

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值