C++面向对象感悟整理

const

表示常量,相当于java中的final关键字,用于方法的修饰符表示在方法范围的不改变的量:
如 
1 void getName()const; // 表示该方法不改变类的成员变量
2 void setName(const string name); // 表示在该方法体重name这个变量不发生值的改变
 

 
静态成员与变量
 
静态的成员可以在全局中进行必须的初始化,并且类的所有对象都共享该值,并且可以但通过类名来访问 如
 
 1 全局区 
 2 int CUser::m_iCount = 10;  // m_iCount为CUser类的静态变量
 3  
 4 方法区
 5 CUser mUser,mUser2;
 6 nUser2.m_iCount  = 15;
 7 // 三者输出结果都为15 , 覆盖全局中的10 
 8 cout<<CUser.m_iCount;
 9 cout<<mUser.m_iCount;
10 cout<<mUser2.m_iCount;

 

 

 
虚方法:
 
1 CUser mUser = new CEUser(); // CEUser为CUser的子类且拥有与父类完全相同的Login()方法
2 mUser.Login(); // 将调用父类CUser的方法,因为定义的mUser类型为CUser,只是调用了子类的构造方法(静态绑定原则)

 

为了实现访问子类CEUser中的Login()多态函数,采用动态绑定技术
 
virtual关键字定义虚方法,定义在父类中则子类默认同名同返回值的方法也为虚方法,实现类似Java中的覆盖功能,若方法名字相同参数列表相同而返回值不同,子类中的方法将发生编译错误
 
因为子类中定义了新的变量,分配了比父类更多的空间,所以父类的析构函数一般都是虚方法, 内存释放时将先调用子类的析构函数再调用父类的析构函数
 

 
虚继承:
 
多继承的几个父类包含了相同的祖父类时,父类最好都是虚继承,这样子类就只有一个祖父类
 
1 class CBird:virtual public  CAnimal
2 ...
3 class CFish:virtual public CAnimal
4 ...
5 class CFishbird:public CBird,public CFish
6 ...

 


 
C++中new关键字
 
比如说我有一个类Test.
我可以用 Test t 或者 Test *t = new Test();

1, 二种方法得到一个类实例,这二种方法有什么区别呢?
2, 我知道new 是动态内存分配!而不加new呢?就是静态分配了吗?
3, 另外,大家在平时用的时候都习惯用哪种方法呀?从性能和内存占用方面考虑哪种方法更好用一些呢?
4, 我记得好像听谁说过,不用NEW声明,对象实例是分配在栈中的!(难道一个类也要分配在栈中吗?)
5, 我用new关键字分配的对象,我不用delete删除它,编译器会自动帮我删除吗?而不会用NEW创建的呢?
 答:
1.前者在堆栈中分配内存,后者为动态内存分配,在一般应用中是没有什么l区别的,但动态内存分配会使对象的可控性增强
2.不加new在堆栈中分配内存
3.大程序用new,小程序直接申请
4.只是把对象分配在堆栈内存中
5.new必须delete删除,不用new系统会自动回收内存


总结
只要new后面为子类构造器,构造函数的调用顺序是父类父类子类,析构函数的调用是子类父类父类;
而同名方法的调用取决于对象初定义的类型。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值