一些要注意的地方

1.尽量以const,enum,inline替换define。

2.旧式的编译器可能不允许static在其申明式上获得初值。此外所谓的‘in-class’初值设定也许只针对整数常量进行,要是你的编译器不支持上述语法,可以将初值放在定义式。要是数组无法初始化时可以考虑使用类中的枚举值。

3.如果成员变量是const或者reference一定要用初值发初始化而不要使用赋值法。

4.构造函数最好使用成员初始化列表而不要在构造函数体内使用赋值操作,成员初始化列表列出的值应该与他们在class中的申明次序相同。

5.位避免跨编译单元之初始化次序问题,请以local static 对象代替non-local static对象。

6.任何class只有含有虚函数都几乎确定应该有个虚析构函数。

7.string,还有所有STL容器如vector、list、set等都不带虚析构函数。

8.析构函数绝对不要吐出异常,如果一个被析构函数调用的的函数可能抛出异常,析构函数应该能够捕获异常,并且吞下异常或者结束程序。

9.如果客户对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数而非析构函数中执行该操作。

10.base class函数构造期间virtual函数绝不会下降到derived class阶层,对象作为就像隶属于base类型一样,非正式的和说法就是virtual函数不是virtual函数。而base class函数          早于derived class 的构造函数,base构造时derived的变量还未初始化。相同道理也适用于析构函数,一旦derived的析构函数执行,对象内的derived成员变量呈现未定义值,进入base的析构函数后就成为一个base class对象,而C++的任何部分包括virtual函数dynamic_casts也会那么看待它。一个优秀的做法就是把共同的实化代码放入一个init函数内(非virtual),这么做还是可能存在问题,最好不要在构造函数和析构函数中调用virtual函数。

11.令赋值操作符返回一个reference to *this  .
   在operator中处理自我赋值:低级方法--进行自我复制检查。高级方法--保存副本。

12.Copying函数应该确保赋值对象内的所有成员变量及base class的成分。不要尝试以一个Copying构造函数初始化另一个Copying构造函数,应将共同技能放在第三个函数中。

13.以独立语句将newed对象存储与智能指针内。如果不这样做,一旦异常抛出,有可能导致难以察觉的资源泄漏。

14.绝不要返回pointer或者reference指向一个local stack对象,或者返回前指向一个heap-allocate对象(可能没有人delete它)

15.类中的纯虚函数可以定义自己的实现,但这可以通过派生类对象或者指向派生类的指针显示调用
class A
{
public:
    virtual void fun1() = 0;
};
void A::fun1()
{
    cout << "void A::fun1()" << endl;
}

class B:public A
{
public:
    virtual void fun1()
    {
        cout << "void B::fun1()" << endl;
        A::fun1();//这样也可以
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    A *q = new A;
    q->fun1();    //error
    A *p = new B;
    p->fun1();
    p->A::fun1();

system("pause");

return 0;
}

16.derived class 内的名称会掩盖base class内的名称。通过基类指针指向派生类可以防止名称掩盖而无法正确调用,实际上是利用的多态。
class A
{
public:
    virtual void fun1() = 0;
    virtual void fun1(int n)
    {
        cout << "void A::fun1(int n)" << endl;
    }
    virtual void fun2()
    {
        cout << "void A::fun2()" << endl;
    }
    void fun3()
    {
        cout << "void A::fun3()" << endl;
    }
    void fun3(int n)
    {
        cout << "void A::fun3(int n)" << endl;
    }
};

class B:public A
{
public:
    virtual void fun1()
    {
        cout << "void B::fun1()" << endl;
    }
    void fun3()
    {
        cout << "void B::fun3()" << endl;
    }
    void fun4()
    {
        cout << "void B::fun4()" << endl;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
//     B b;
//     int n = 250;
//     b.fun1();
//     b.fun1(n);   //error,作用域被覆盖必须显示调用b.A::fun1(n)
//     b.fun2();
//     b.fun3();
//     b.fun3(n);   //error,作用域被覆盖必须显示调用b.A::fun3(n)

//     B *p;
    //     int n = 250;
    //     p->fun1();
    //     p->fun1(n);   //error,作用域被覆盖必须显示调用p->A::fun1(n)
    //     p->fun2();
    //     p->fun3();
    //     p->fun3(n);   //error,作用域被覆盖必须显示调用p->A::fun3(n)

//通过基类指针指向派生类可以防止名称掩盖而无法正确调用,实际上是利用的多态
    A *a = new B;
    int n = 250;
    a->fun1();
    a->fun1(n);
    a->fun2();
    a->fun3();
    a->fun3(n);

B *p = new B;
p->fun1();
p->fun1(5);   //error,派生类重写基类的同名称函数后会掩盖base class内的名称,无法调用基类的fun1(int n),如果没有重写的话可以调用基类的对象函数
p->fun2();
p->fun3();
p->fun3(6) ;//error,派生类重写基类的同名称函数后会掩盖base class内的名称,无法调用基类的fun1(int n),如果没有重写的话可以调用基类的对象函数
p->fun4();

system("pause");

return 0;
}

17. non-virtual函数A::fun3和B::fun3都是都是静态绑定的,意识就是q被申明为pointer-to-A,通过p调用的non-virtual函数永远是A所定义的版本,即使q指向的

一个类型为A的派生class对象。另一方面,virtual函数确实动态绑定,所以他们不会受此问题之苦,如果fun3是个virtual函数,不论p还是q调用fun3,都会导致调用

B::fun3,因为他们真正指的都是一个类型为B的对象。

接上面类A、B

B *p = new B;
p->fun3(); //调用的是B的fun3
A *q = new B;
q->fun3(); //调用的是A的fun3

18. 请绝对不要重新定义一个继承而来的non-virtual函数,如果需要这么做,一开始就应该考虑设计为一个virtual函数

19. 绝不要重新定义继承而来的缺省参数值,virtual函数是动态绑定,调用一个virtual函数时,究竟调用哪一份函数实现代码,取决于调用的那个对象的鼎泰类型,

而缺省参数值确是静态绑定,静态绑定下函数并不从其base继承缺省函数值

时间: 2024-11-03 22:18:35

一些要注意的地方的相关文章

汉克斯打卡上对方可节省了分手了地方

http://t.cn/RPCN1v9 http://t.cn/RPCN1hY http://t.cn/RPCN1yQ http://t.cn/RPCN143 http://t.cn/RPCN1qh http://t.cn/RPCN1VY http://t.cn/RPCN1qR http://t.cn/RPCN1JW http://t.cn/RPCN1fD http://t.cn/RPCN1i0 http://t.cn/RPCN1op http://t.cn/RPCN1hY http://t.c

DataTables学习:从最基本的入门静态页面,使用ajax调用Json本地数据源实现前端开发深入学习,根据后台数据接口替换掉本地的json本地数据,以及报错的处理地方,8个例子(显示行附加信息,回调使用api,动态显示和隐藏列...),详细教程

一.DataTables  个人觉得学习一门新的插件或者技术时候,官方文档是最根本的,入门最快的地方,但是有时候看完官方文档,一步步的动手写例子,总会出现各种莫名其妙的错误,需要我们很好的进行研究出错的地方. 官方网站(中文):http://datatables.club/ 官方网站:https://www.datatables.net/  二.简单的例子 怎样简单地使用DataTables?使用下方简单的几行代码,一个方法初始化table. $(document).ready(function

Android在项目中接入腾讯TBS浏览器WebView的教程与注意的地方

腾讯TBS浏览器服务 我们都知道,在Android开发中,经常会用到Webview,而且WebView是出了名的坑的,各种bug.这时候腾讯老哥站出来了,搞了一个TBS浏览器服务这个东西. 说得这么屌,其实就是一个webView控件,然后解析解析网页的内核是他自己做的,叫X5内核(系统原生的WebView用的是WebKit内核),所以我们开发者用的时候,主要就是用这个com.tencent.smtt.sdk.WebView控件 当然这个控件有很多功能,当然也有些要注意的地方. 官网地址:http

最适合情侣出游的地方,你们去过没

悠游阳朔一定要试试这里的美食.桂林米粉是最实惠的早餐,米粉加上卤肉浇头也不过两三元钱,可丰盛程度却堪比自助餐.酸豆角.萝卜干.酱黄瓜再加上各种调料任君选用. 最适合情侣一起旅游的地方 杭州:在西湖边缘定三生 "百年修得同船渡,千年修得共缠绵"的句子永远不老,西湖的浪漫也可见一斑.来到这里,情侣们可以放松心情漫步在堤坝上,享受水乡温婉的柔情.说起爱情,人们自然想到西湖,秀质天成的西子湖一直与爱情有着不解之缘,从泛舟湖上.携手同隐的西施与范蠡,到水漫金山寺.被压雷峰塔的白娘子,坚如磐石.韧

找地图上道路不连通的地方(考虑通行方向)

实现算法 1.首先将满足条件的道路(link) 放到指定的容器中 vector<sdk::link> vec_linkA; vector<sdk::link> vec_linkB;     //同时copy一份到vec_linkB vector<sdk::link> vec_link_error; //存放不通地方的道路也就是link 2.将vec_linkB 的link逐一出栈去vec_linkA查找是否有该link下一条可行的路,只要能找到一条就证明这里是通的 a.

论黑客喜欢攻击地方网络棋牌游戏原因与解决方案

地方棋牌游戏很容易招到黑客攻击,尤其是对于一些比较出名的平台,风险就更高一些.究竟为什么黑客这么喜欢攻击地方性棋牌游戏呢?厦门欧页网络科技有限公司,与你一起探讨. 经过许多被攻击的案例显示,黑客之所以会选择攻击棋牌游戏平台是以下原因: 1. 盗卖游戏币.一般这种情况会出现在比较成熟的平台上,使用这种方式通常都是长期进行的过程.就像蛀米虫一样,慢慢的.悄悄的进行. 2. 勒索行为.这个是绝大部分黑客攻击平台的原因.如果出现这个原因的,黑客就不会专门去挑选平台,无论平台大小.是否成熟.做这种事的也并

什么是core dump linux下用core和gdb查询出现&quot;段错误&quot;的地方

什么是core dump   linux下用core和gdb查询出现"段错误"的地方 http://blog.chinaunix.net/uid-26833883-id-3193279.html 有些时候我们在一段C代码的时候,由于对一个非法内存进行了操作,在程序运行的过程中,出现了"段错误". 呵呵,这种问题我想很多人会经常遇到.遇到这种问题是非常无语的,只是提示了"段错误",接着什么都没 有,如果我们一味的去看代码找太疼苦了,因为我们都相信自

《中国大百科全书》第三版水利学科地方水利分支召开第一次工作会议

9月2日,<中国大百科全书>第三版水利学科地方水利分支召开了第一次工作会议.会议由分支主编.中国水利学会常务副理事长顾浩主持.办公厅巡视员陈茂山出席会议并讲话.会议对做好地方水利分支编纂工作进行了部署,对分支编纂工作方案做了讨论和研究. 陈茂山强调了编纂<中国大百科全书>第三版的重大意义,介绍了<中国大百科全书>第一版.第二版和<中国水利百科全书>第一版.第二版的编纂情况,就做好<中国大百科全书>第三版地方水利分支编纂工作提出明确要求. 分支副主

Java基础-接口中国特色社会主义的体制中有这样的现象:地方省政府要坚持党的领导和按 照国务院的指示进行安全生产。请编写一个java应用程序描述上述的体制现象。 要求如下: (1)该应用程序中有一个“党中央”接口:CentralPartyCommittee,该接口中 有个“坚持党的领导”方法:void partyLeader() (2)该应用程序中有一个“国务院”抽象类:StateCouncil,

36.中国特色社会主义的体制中有这样的现象:地方省政府要坚持党的领导和按 照国务院的指示进行安全生产.请编写一个java应用程序描述上述的体制现象. 要求如下: (1)该应用程序中有一个“党中央”接口:CentralPartyCommittee,该接口中 有个“坚持党的领导”方法:void partyLeader() (2)该应用程序中有一个“国务院”抽象类:StateCouncil,该抽象类中有个“安 全生产”的抽象方法:abstract void safetyInProduction() (

EHCACHE采用分布需要注意的地方

分布式EHCACHE系统,有两种同步方式 方式1 :  RMI组播方式 这也是最常用的方式,配置简单,关键一点,各EHCACHE的节点配置都是一样的 原理:这样当缓存改变时,ehcache会向230.0.0.1端口4446发RMI UDP组播包 (230.0.0.1 是D类网络地址,专门用于广播) 这种组播方式的缺陷:EHCACHE的组播做得比较初级,功能只是基本实现(比如简单的一个HUB,接两台单网卡的服务器,互相之间组播同步就没问题),对一些复杂的环境(比如多台服务器,每台服务器上多地址,尤