文档章节

C++ 注意事项

secondtonone1
 secondtonone1
发布于 2016/08/09 17:53
字数 878
阅读 7
收藏 0

一. 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中的元素是同一份数据

 

我的公众号,谢谢关注:

 

© 著作权归作者所有

共有 人打赏支持
secondtonone1

secondtonone1

粉丝 4
博文 38
码字总数 53981
作品 1
东城
高级程序员
运行MFC程序提示没有找到MFC42D.DLL文件的解决方法

运行MFC AppWizard(exe)程序,汇编成功,可是运行时,出现错误:“没有找到MFC42D.DLL,因此这个应用程序未能启动.重新安装应用程序可能会修复此问题. ” 解决方案为:出现上述提示的原因是...

lcniuren33
2012/07/04
0
0
.a .framework打包注意事项

静态库中使用了C++混编 我们都知道在OC项目中使用了C++文件来混编的话,就会报如图所示的错误。其最快捷的解决方法就是将项目中的一个文件的.m后缀改成.mm。 如果在制作静态库时也使用了C++...

_故事的小黄瓜_
05/17
0
0
【转载】数据结构利器之私房STL

数据结构利器之私房STL 此系列的文章适合初学有意剖析STL和欲复习STL的同学们。 学过c++的同学相信都有或多或少接触过STL。STL不仅仅是c++中很好的编程工具(这个词可能有点歧义,用类库更恰...

悠米海
2012/12/02
0
0
C语言编程学习:使用函数必须知道的3点注意事项

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你学知识
06/13
0
0
C++基础教程之C/C++区别

C/C++基础教程之C/C++区别 这是C++教程得第一步,后续会持续更新哦!欢迎新手(具有C基础),老鸟可绕道,可指导。 C++标准输入和输出 C++标准输入和输出分别是cin和cout,用法非常简单 cin>>n...

这个人很懒什么都没留下
09/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【mpvue】三

使用了快1个月,陆续整理发现的坑 1、pageA-pageB-pageA-pageC 如果以这种顺序,大概理解成,列表进详情B, 返回列表进入详情C,那么进入详情C的时候,会因为缓存,先展现详情B的内容。解决方...

登天的感觉
7分钟前
0
0
在EXCEL指定SHEET页,指定文字位置,插入批注

Java操作EXCEL文件,利用POI,在EXCEL指定SHEET页中指定文字位置处插入批注 package excel; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.poi.hssf......

zhaochaochao
8分钟前
0
0
一些网站。

UI schema,可以用json定义UI表单:https://jsonforms.io/examples/array

王坤charlie
15分钟前
0
0
百万连接,百亿吞吐量服务的JVM性能调优实战

转载占小狼博客 应用:shark-新美大移动端网络优化(每日接受移动端请求约150亿) 应用特点 : qps比较高,新生代增长飞快 用户的连接需要维持一段时间 单机需要维持海量连接,几十万的级别 以...

BakerZhu
18分钟前
0
0
iOS涂色涂鸦效果、Swift仿喜马拉雅FM、抽屉转场动画、拖拽头像、标签选择器等源码

iOS精选源码 LeeTagView 标签选择控件 为您的用户显示界面添加美观的加载视图 Swift4: 可拖动头像,增加物理属性 Swift版抽屉效果,自定义转场动画管理器 Swift 仿写喜马拉雅FM 可能是最好用...

sunnyaigd
19分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部