C++ 注意事项

一. C++类的引用成员,类的常量成员,类的static成员的初始化方式

类的引用成员和常量成员初始化放在初始化列表里,因为初始化只有一次,需要在构造函数之前进行初始化,

写在类的构造函数会出错。

类的static变量要放在类声明的外边定义,因为static变量属于整个类,而不是类对象,所以不能放在类的构造

函数里。

举个例子:

一个类中既有常量成员也有引用成员

class MyClass
{
public:
    MyClass(int value):a(1),b(a), m_nValue(value),c(m_nValue),d(m_nValue){}
public:
    const  int  a;
    const  int & b;
    int & c;
    const int &d;
    int m_nValue;
    static tms s;
    static double f;
};

tms MyClass::s;
double MyClass::f = 0.33;

类的引用成员必须在类的初始化列表初始化,而且必须初始化,否则编译出错。

类的static成员需要在类外定义,否则使用时会出错。

类的常引用和引用的区别是

1 可以通过引用修改引用对象的数值,不可以通过常引用修改引用对象的数值

2 引用可以更改引用的对象,从而引用另一个变量,常引用是不能更改引用的对象的。

3常引用可以引用非常量(变量)和常量以及右值,引用只能引用变量。

4当常引用引用变量的时候,可以修改变量值,常引用的数值会随着改变,但是不能

直接修改常引用。

下面是测试

二 类的常对象调用的接口必须都为常函数,很多人写法不注意编译会报错。

代码示例为自己的一个项目,msgStream为常引用,那么他内部的列表返回的迭代器需要用const_iterator

    MsgStream( const MsgStream & msgStream)
    {
        m_nCount = msgStream.m_nCount;

        msgStream.m_listConMsg.begin();

        for(std::list<ConMsgNode>::const_iterator  msgIter = msgStream.m_listConMsg.begin();
            msgIter != msgStream.m_listConMsg.end();  msgIter++ )
        {
            m_listConMsg.push_back(*msgIter);
        }

    }

msgStream 这个常引用也只能调用常量成员函数, 函数体后有const声明的函数

三析构函数的顺序,构造函数的顺序

1 当类子类中包含其他的类,构造的顺序是先构造基类对象,然后构造子类包含的类对象,最后构造子类对象。

2当基类中包含其他的类,构造的顺序是先构造基类中包含的类对象,然后构造基类对象,最后构造子类对象。

当类子类中包含其他的类,析构的顺序是先构子类对象,然后析构子类包含的其他类对象,最后析构基类。

4当基类中包含其他的类,析构的顺序是先析构子类对象,然后析构基类对象,最后析构基类中其他对象。

下面是别人写的代码

class c
{
public:
    c(){ printf("c\n"); }
protected:
private:
};

class b
{
public:
    b(){ printf("b\n");}
protected:
    c C;
private:
};

class a : public b
{
public:
    a(){ printf("a\n"); }
protected:
private:
};

int main()
{
    a A;
    getchar();
}

结果:

class c
{
public:
    c(){ printf("c\n"); }
protected:
private:
};

class b
{
public:
    b(){ printf("b\n");}
protected:
private:
};

class a : public b
{
public:
    a(){ printf("a\n"); }
protected:
    c C;
private:
};

int main()
{
    a A;
    getchar();
}

结果:

class c
{
public:
    c(){}
    ~c(){ printf("c\n"); }
protected:
private:
};

class b
{
public:
    b(){}
    ~b(){ printf("b\n");}
protected:
private:
};

class a : public b
{
public:
    a(){}
    ~a(){ printf("a\n"); }
protected:
    c C;
private:
};

int main()
{
    a A;
    return 0;
}

结果:

四 list 直接赋值给另外一个list,并不会导致list元素的深拷贝,两个list中的元素是同一份数据

我的公众号,谢谢关注:

时间: 2024-08-14 23:18:14

C++ 注意事项的相关文章

面向对象注意事项

在面向对象中,有实例变量和类变量,实例变量为类对象的实例成员,而类变量不仅类可以直接调用,而且类的对象也可以调用.类对象可以对实例变量进行添加.修改.删除操作等... 下面就用个示例来做参考: #!/usr/bin/env python # -*- coding:utf-8 -*- class PersonInfo(object): commity_data = 123 def __init__(self,name,age): self.name = name self.age = age de

switch使用时有哪些注意事项

switch语句用于多分支选择,在使用switch(expr)的时候,expr只能是一个枚举常量(内部也是由整型或字符类型实现)或一个整数表达式,其中整数表达式可以是基本类型int或其对应的包装类Integer,当然也包括不同的长度整型,例如short.由于byte.short和char都能够被隐式地转换为int类型,因此这些类型以及它们对应的包装类型都可以作为switch的表达式.但是,long.float.double.String类型由于不能够隐式地转换为int类型,因此它们不能被用作sw

Citrix Xen 6.2 在Adaptec raid 6805卡子上的安装注意事项

Installing with Citrix XenServer   Note: To install the Adaptec RAID controller driver with CitrixXenServer, you must burn the XenServer driver iso image to a writeable CD. Youwill be prompted to insert the XenServer driver CD twice.You need the XenS

CloudStack添加新的API注意事项

1.***Cmd上面的@APICommand里的responseObject关联对于的Response: 2.在tomcatconf/command.properties.in添加新API的权限: 3.为得到Cmd,都需要实现PluggableService接口的getCommands()方法,核心Cmd都需在ManagementServerImpl类的getComands()方法里将新添加的***Cmd类添加到cmList中. CloudStack添加新的API注意事项,码迷,mamicode

开发APP注意事项

开发APP的时候要注意的一些事项?随着互联网的高速发展,移动APP也如雨后春笋般快速发展.营销战略也逐渐从PC端转为移动端,开创新的营销道路--移动营销.面对移动APP的火热,越来越多的企业和商家们重视移动营销这一块,也迫切开发属于自己的企业APP. 移动开发大师表示:"我们在热衷开发APP的同时也要注意一些事项,以免造成资源的浪费."下面让麦子学院老师来告诉你,当你在开发APP的时候要注意的一些事项: 首先,如果你要开发APP首先第一件事就是做好充分的市场调查,明确知道你要开发什么样

复合索引的优点和注意事项

概念:     单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上;     用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引);     复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引;     同时有两个概念叫做窄索引和宽索引,窄索引是指索引列为1-2列的索引,宽索引也就是索引列超过2列的索引;     设计索引的一个重要原则就是能用窄索引不用宽索引,因为窄索引往往比组合索引更有效; 使用:     创建索引     create index idx1 o

Jetson TX2安装Jetpack 3.0注意事项

Jetson TX2安装Jetpack 3.0注意事项 nvidia jetson tx2配置caffe: http://blog.csdn.net/jiongnima/article/details/70040262 CSDN jiongnima博主的这篇文章非常详细完整,但是作为一个初次接触nvidia jetson TX2的人来说,还是会难免遇到一些困难,下面我在这篇文章的基础上,写一些我在安转Jetpack 3.0时遇到的问题,希望大家可以坐在以后的安装过程中规避这些问题:  1.在nv

Dockerfile注意事项

准则 尽量将Dockerfile放在空目录中,如果目录中必须有其他文件,则使用.dockerignore文件. 避免安装不必须的包. 每个容器应该只关注一个功能点. 最小化镜像的层数. 多行参数时应该分类.这样更清晰直白,便于阅读和review,另外,在每个换行符\前都增加一个空格. 对构建缓存要有清楚的认识. 指令注意事项 FROM Dockerfile reference for the FROM instruction 任何时候,尽量使用官方镜像源作为你镜像的基础镜像.我们建议使用Debi

购买家电注意事项

在预算有限情况下,如何购买到更具性价比的家电. 1 在5.1.10.1等节日购买,或者在苏宁.京东等几周年纪念日做活动时购买. 2 尽量要在正规渠道.大商场购买,并且购买有品牌的家电. 第二部分 分类家电的购买注意事项 1 热水器 先谈好热水器的价格,并且最后要询问是否拆旧.是否免费安装.安装过程中是否有其他收费事项(比如接出来的软管) 我买了A.O史密斯的热水器,安装师傅帮忙安装了一下,配了两根软管和水阀,还有固定架子,就收了300块钱. 如果事先知道,那销售签订合同时,肯定还可以谈价格. 2

使用mysql索引技巧及注意事项

一.索引的作用 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重. 在数据量和访问量不大的情况下,mysql访问是非常快的,是否加索引对访问影响不大.但是当数据量和访问量剧增的时候,就会发现mysql变慢,甚至down掉,这就必须要考虑优化sql了,给数据库建立正确合理的索引,是mysql优化的一个重要手段. 索引的目的在于提高查询效率,可以类比字典,如果要查"mysql