一个代表性C++代码例子

C++我好久没碰了,不过因为要面试,不得不复习一下。我个人没那么聪明,C++高超的语言啊,跟Java不一样,好久不碰叫我不查资料在纸上写涉及到他的高层功能的程序或许还真有点够呛,不像我的一个才华出众的朋友,是StackOverflow的C++ top writer,能把C++的非trivial的功能细节讲得滚瓜烂熟,其包括C++ 11里的移动语义,那些我出于好奇以前也自己学过。相反呢,Java是个相对傻逼的语言,几乎涉及不到任何非算法的核心计算机科学观念,所以算法之外感觉也没啥好考的,我也很容易就通过了Java的面试,因为问的都是不涉及到语言细节的很简单的算法题。

C++呢,我觉得一个人如果对编程语言设计和编译器有兴趣,C++的某些高级功能却是好的出发点。比较简单的例子就是他的内存分配是需要手动的,而且与C底层不一样的是,他不是一个简单的free,他的类还都有解构函数,为了在任意该类对象生命期结束时释放为了存他的属性释放的内存及做一些其他与对象解构相关的操作,如记录。这种有一定技术含量的高级功能有一大堆,如指向,拷贝构建函数,移动构建函数,运算符重载,赋值运算符,虚拟函数,模板,等等。

虽然这些语言工程非常丰富并有一定难度,C++语言我也看到不少负面的评论,主要是用它开发的速度太慢,难读维持成本高,这种运行速度能优化到极限并富有这种高级功能的语言的用武之地实在太少,一些需要运行速度优化的函数库用它还好,但是一般情况下真是没有什么意义,真正遇到运行速度瓶颈(现在这种情况是愈来愈少了),把程序的少数关键逻辑以C++写就可以了,而且与C相比,那些高级功能的帮助也并不一定太大。所以那些高超的功能或许看着很牛逼,但是对程序员所提供的或许远远低于程序更加复杂所产生的开发和维持成本。

更详细解释C++的弊端可以看看那个人给我发的https://yosefk.com/c++fqa/defective.html。对于中国学计算机的人的C++狂,他只觉得很受误导。怎么说呢,自己把他看成一种intellectual masturbation吧,我的上所提到的那位人C++百科全书的朋友却有一次对我说他想过写一个C++的编译器玩一玩,只不过要花10年的全职时间。

好吧,我们下面就少扯C++语言了,先看看它的我从CSDN找到的一块代码,分析一下。

#include
#include
 
using namespace std;
 
class CMyString
{
public:
	CMyString(const char* pData = nullptr);
	CMyString(const CMyString& str);
	~CMyString(void);
 
	CMyString& operator = (const CMyString& str);
 
	void Print();
 
private:
	char* m_pData;
};
 
CMyString::CMyString(const  char *pData)
{
	if (pData == nullptr)
	{
		m_pData = new char[1];
		m_pData[0] = '\0';
	}
	else
	{
		int length = strlen(pData);
		m_pData = new char[length + 1];
		strcpy_s(m_pData,length+1, pData);
	}
}
 
CMyString::CMyString(const CMyString &str)
{
	int length = strlen(str.m_pData);
	m_pData = new char[length + 1];
	strcpy_s(m_pData,length+1, str.m_pData);
}
 
CMyString::~CMyString()
{
	delete[] m_pData;
}
 
CMyString& CMyString::operator = (const CMyString& str)
{
	if (&str != this)
	{
		CMyString strTemp(str);
		char* pTemp = strTemp.m_pData;
		strTemp.m_pData = m_pData;
		m_pData = pTemp;
	}
 
	return *this;
}

———————

作者:Alatebloomer
来源:CSDN
原文:https://blog.csdn.net/alatebloomer/article/details/80308482
版权声明:本文为博主原创文章,转载请附上博文链接!

构建函数很简单,没啥好说的,与此对偶的解构函数也一样。

拷贝构建函数也就是在堆内存里分配足够多内存并复制至之参数里的串(以字符指针表示)。

最tricky的是赋值运算符。第一,因为这是赋值,左值已被构建,则有赋值自直该不了了之的“边界情况”,而为此,我们简单用一个if条件。在它里面,由于串长度不是固定的,所以不能直接复制。反而,我们要在堆内存新建一个字符指针,复制右值串字符,然后把左值的字符指针属性赋值为它。同时,我们需要垃圾回收旧指针,为此,我们利用C++对象离开作用域时解构函数被调用。由于在CMyString对象构建在if里,离开if时它的解构函数被调用,那我们就把老的指针交换到那儿。我个人发觉到还可以做一点小简化,那就是

char* pTemp = strTemp.m_pData;
strTemp.m_pData = m_pData;
m_pData = pTemp;

改为

swap(m_pData, strTemp.m_pData);

使该代码之作用变得即更明确又更简化。

其实,刚才这些也都挺弱智的,没啥难的,但是还是得小心一点。加上,C++的句法也复杂一点,尤其在涉及到这些面对对象功能的情况下,所以我说面试还是准备一下最好吗。

好,今天应该就到此结束,若我有时间又足够感兴趣,或许我会对一对关于C++ 11新加的移动语义,包括什么shared_ptr,的中文资料复习一下并自己写一写,在巩固自己的C++知识的同时,又能学到一些新的有意思的中文计算机术语,也提高我自己几乎没有经过任何正式训练的中文写作能力。