c++ 类基本概念易错点

原创 2016年06月02日 20:49:41

总结常见的类基本概念中的容易混淆和弄错的地方。


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,初始化时不能带static
int Test2::m_nStaticData = 10;

//static 函数无this指针,无法访问非static成员变量;声明时带static,初始化时不能带static
void 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,初始化时不能带explicit
	explicit 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


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

c 基本概念易错点总结

1、i++类 int i = 1 ,j =2; int k = i+++j; cout 2、x=x+1,

C++ 程序设计基本概念 知识点 小结

知识点包括:全局变量的二次赋值;计算转化为二进制后,数字中 1 的数量;用一个非循环表达式判断一个数是否是2的N次方;逻辑运算与位逻辑运算;printf 输入表达式的执行顺序;位运算判断输入参数是否为...

c++类的继承与派生的基本概念和语法

先简单地理解下继承以及派生的关系和概念: 类之间的继承(Inheritance)我们就理解为一个类从另一个类获取成员变量和成员函数的过程。 比如说类 M 继承于类 N,那么 M 就拥有 N 的成员...

c++类的基本概念

1.OOP的重要特性:    ●抽象:           将问题的本质特征抽象出来,并根据特征来描述解决方案,抽象是通往用户类型的捷径。    ●封装和数据隐藏   封装:公有接口表示设计的抽象组件...

C++类与对象(1) - 基本概念

C++中,结构体与类基本类似,除了下面的几个不同点。 1) 类的成员默认是私有的(private),而结构体的成员默认是公有的(public). 例子1会编译失败,例子2运行正常。 // Progr...

面向对象c++的基本概念

  • 2015-11-07 12:06
  • 66KB
  • 下载

C++基本概念——const与基本类型和类、const与指针、const与引用

C++中的const用法总结,const与基本类型和类、const与指针、const与引用

C++基本概念

  • 2008-07-23 18:53
  • 117KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)