c++ 类基本概念易错点
来源:互联网 发布:李敖对女性的态度知乎 编辑:程序博客网 时间:2024/05/18 23:53
总结常见的类基本概念中的容易混淆和弄错的地方。
1.const
[1].函数声明为const,无法修改类成员变量的值,声明和实现都需要加const关键字
[2].const函数还是可以正常访问const和非const成员变量
[3].声明变量为mutable表示变量是特殊的,在const中还可以改变值
class Test1{public:Test1();void Display() const;//声明和实现都需要加const关键字private://const函数中能访问const和非const成员变量,但不能改变非const成员变量int m_nNonConstData;const int m_nConstData;//mutable是特殊的,在const中还可以改变值mutable int m_nDisplayTime;};Test1::Test1(): m_nConstData(10){m_nDisplayTime = 0;m_nNonConstData = 20;}void Test1::Display() const{m_nDisplayTime++;//m_nConstData++;//error!!!//m_nNonConstData++;//error!!!cout << m_nDisplayTime << "\tTest1::Display ConstData:" << m_nConstData << " NonConstData:" << m_nNonConstData << endl;}
2.static
[1].static 变量不管是否为private 在类外初始化,声明时带static,初始化时不能带static
[2].static 函数无this指针,无法访问非static成员变量;声明时带static,初始化时不能带static
[3].const static可以直接在类声明中初始化
class Test2{public:static void Display();private:static int m_nStaticData;const static int m_nConStaData = 20;//const static可以直接在类中如此初始化};//static 不管是否为private 均如此初始化,声明时带static,初始化时不能带staticint Test2::m_nStaticData = 10;//static 函数无this指针,无法访问非static成员变量;声明时带static,初始化时不能带staticvoid Test2::Display(){cout << "Test2::Display staticData:" << m_nStaticData << " ConStaData:" << m_nConStaData << endl;}
3.构造函数
[1].一旦有构造函数,则不会合成默认构造函数,为了声明默认参数的动态数组或容器操作必须自己定义一个默认构造函数
[2].explicit 指明必须显式调用构造函数完成转换,无法使用隐式转换;声明时带explicit,初始化时不能带explicit
[3].const/引用、无默认构造函数的类,都需要使用初始化表达式来初始化
[4].成员变量初始化顺序——按照类中变量声明顺序
class Test3{public:Test3();//一旦有构造函数,则默认构造函数无效//explicit 指明必须显式调用构造函数完成转换,无法使用隐式转换//声明时带explicit,初始化时不能带explicitexplicit Test3(int nData1);void Display();int m_nData1;int m_nData2;int m_nData3;const int m_nData4;//const/引用、无默认构造函数的类 都需要使用初始化表达式来初始化};void DisplayTest3(Test3 t);Test3::Test3():m_nData4(0){m_nData1 = m_nData2 = m_nData3 = 0;//m_nData4 = 0;//error!!!}//初始化顺序——按照类中变量声明顺序Test3::Test3( int nData1 ) : m_nData1(nData1), m_nData3(m_nData2+2), m_nData2(m_nData1+2),m_nData4(0){}void Test3::Display(){cout << "Test3::Display " << "Data1:" << m_nData1 << " Data2:" << m_nData2 << " Data3:" << m_nData3 << endl;}void DisplayTest3(Test3 t){cout << "DisplayTest3: " << t.m_nData1 << endl;}
4.友元
[1].主要注意类和友元类的声明顺序,先声明友元类,然后在类中声明友元,最后在友元类实现中访问类的具体成员
[2].注意三种常见形式的友元声明
class Test4;//注意先声明类以供定义友元,然后在实现中访问具体类的成员class ClassShow1{public:void ShowTest4(Test4 t);};class ClassShow2{public:void ShowTest4(Test4 t);};//前面声明了类,在这里定义友元class Test4{public:Test4();friend void ShowTest4(Test4 t);friend ClassShow1;friend void ClassShow2::ShowTest4( Test4 t );//指明类的函数时,需要指明类的作用域private:int m_nData;};void ShowTest4(Test4 t);
本文完整演示代码下载链接
原创,转载请注明来自http://blog.csdn.net/wenzhou1219
0 0
- c 基本概念易错点总结
- C语言基本概念中的易错点
- C#基本概念
- c基本概念
- C基本概念
- c++ 类基本概念易错点
- Objective-C---1---类的有关基本概念
- C中一些基本概念
- C语言的基本概念
- xml基本概念C
- [C#]基本概念:堆栈
- C语言-向量基本概念
- C基本概念(一)
- C语言基本概念
- C语言基本概念理解
- Objective-c 基本概念
- C指针的基本概念
- C语言-向量基本概念
- Android 嵌套滚动条
- JavaScript知识结构
- linux2.6字符设备驱动开发模板
- 使用单线程还是多线程的问题
- BOM
- c++ 类基本概念易错点
- 有关强类型语言,弱类型语言,静态语言,动态语言的看法
- 1.3、Git远程仓库
- Topcoder srm div2 500
- 手写的一个图表插件
- kafka学习一:简介
- 1.4、Git分支管理
- 删数问题题解
- JavaScript知识结构