关闭

c++ 类基本概念易错点

标签: c++conststatic构造函数
372人阅读 评论(0) 收藏 举报
分类:

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


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


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    公告
    个人资料
    • 访问:354845次
    • 积分:4298
    • 等级:
    • 排名:第7024名
    • 原创:105篇
    • 转载:0篇
    • 译文:0篇
    • 评论:218条
    博客专栏
    最新评论