这个在面试或笔试的时候常问到或考到。
已知类String的原型为:
C++代码
1. class String
2. {
3. public:
4. String(const char *str = NULL);// 普通构造函数
5. String(const String &other); // 拷贝构造函数
6. ~ String(void); // 析构函数
7. String & operate =(const String &other);// 赋值函数
8. private:
9. char *m_data;// 用于保存字符串
10. };
class String
{
public:
String(const char *str = NULL);// 普通构造函数
String(const String &other); // 拷贝构造函数
~ String(void); // 析构函数
String & operate =(const String &other);// 赋值函数
private:
char *m_data;// 用于保存字符串
};
请编写String的上述4个函数。
C++代码
1. //普通构造函数
2. String::String(const char *str)
3. {
4. if(str==NULL)
5. {
6. m_data = new char[1]; // 得分点:对空字符串自动申请存放结束标志'\0'的//加分点:对m_data加NULL 判断
7. *m_data = '\0';
8. }
9. else
10. {
11. int length = strlen(str);
12. m_data = new char[length+1]; // 若能加 NULL 判断则更好
13. strcpy(m_data, str);
14. }
15. }
16. // String的析构函数
17. String::~String(void)
18. {
19. delete [] m_data; // 或delete m_data;
20. }
21. //拷贝构造函数
22. String::String(const String &other) // 得分点:输入参数为const型
23. {
24. int length = strlen(other.m_data);
25. m_data = new char[length+1]; //加分点:对m_data加NULL 判断
26. strcpy(m_data, other.m_data);
27. }
28. //赋值函数
29. String & String::operate =(const String &other) // 得分点:输入参数为const
30.
31. 型
32. {
33. if(this == &other) //得分点:检查自赋值
34. return *this;
35. delete [] m_data; //得分点:释放原有的内存资源
36. int length = strlen( other.m_data );
37. m_data = new char[length+1]; //加分点:对m_data加NULL 判断
38. strcpy( m_data, other.m_data );
39. return *this; //得分点:返回本对象的引用
40.
41. }
//普通构造函数
String::String(const char *str)
{
if(str==NULL)
{
m_data = new char[1]; // 得分点:对空字符串自动申请存放结束标志'\0'的//加分点:对m_data加NULL 判断
*m_data = '\0';
}
else
{
int length = strlen(str);
m_data = new char[length+1]; // 若能加 NULL 判断则更好
strcpy(m_data, str);
}
}
// String的析构函数
String::~String(void)
{
delete [] m_data; // 或delete m_data;
}
//拷贝构造函数
String::String(const String &other) // 得分点:输入参数为const型
{
int length = strlen(other.m_data);
m_data = new char[length+1]; //加分点:对m_data加NULL 判断
strcpy(m_data, other.m_data);
}
//赋值函数
String & String::operate =(const String &other) // 得分点:输入参数为const
型
{
if(this == &other) //得分点:检查自赋值
return *this;
delete [] m_data; //得分点:释放原有的内存资源
int length = strlen( other.m_data );
m_data = new char[length+1]; //加分点:对m_data加NULL 判断
strcpy( m_data, other.m_data );
return *this; //得分点:返回本对象的引用
}
剖析:
能够准确无误地编写出String类的构造函数、拷贝构造函数、赋值函数和析构函数的面试者至少已经具备了C++基本功的60%以上!在这个类中包括了指针类成员变量m_data,当类中包括指针类成员变量时,一定要重载其拷贝构造函数、赋值函数和析构函数,这既是对C++程序员的基本要求,也是《Effective C++》中特别强调的条款。仔细学习这个类,特别注意加注释的得分点和加分点的意义,这样就具备了60%以上的C++基本功!
分享到:
相关推荐
详解C++ 编写String 的构造函数、拷贝构造函数、析构函数和赋值函数 编写类String 的构造函数、析构函数和赋值函数,已知类String 的原型为: class String { public: String(const char *str = NULL); // 普通...
主要包含了strcpy函数和类String的构造函数、析构函数、赋值函数和重载运算符函数等代码实现。
编写类String的构造函数,包括构造函数,析构函数,拷贝构造和赋值函数
编写strcpy函数和类String的构造函数、析构函数、赋值函数和重载运算符函数[文].pdf
。。。
本文主要介绍了C/C++面试题:编写类String的构造、析构和赋值函数,解析构造函数、析构函数和赋值函数的编写方法
1. 编写类String的构造函数、析构函数和赋值函数和测试程序。 已知类String的原型为: #include <iostream.h> #include <string.h> class String {public: String(const char *str=NULL); // 普通构造函数 String...
本文实例为大家分享了c++编写String类的具体代码,供大家参考,具体内容如下 class String { public: String(const char* = nullptr); //普通构造函数 String(const String& other); //拷贝构造函数 ~String...
(2)分别为继承和组合方式下为各类添加构造函数、析构函数,增加相应测试代码,体验对象的初始化和构造顺序。 (3)将摄像机类和行车记录仪类功能相近的函数(如拍摄、编码等功能函数)设为同名函数,增加相应测试...
已知类String的原型为: class String ... //析构函数 String & operator = (const String ?); //赋值构造函数 private: char * m_data; //用于保存字符串 }; 请编写String的上述4个函数。
这些关键字能作为函数和变量的标识符在C程序中使用,尽管C++包含了所有的C,但显然没有任何C++编译器能编译这样的C程序。 C程序员可以省略函数原型,而C++不可以,一个不带参数的C函数原型必须把void写出来。而C++...
4、编写拷贝构造函数和重载赋值运算符,完成字符串类对象直接赋值操作。 5、编写析构函数,释放初始化时开辟的空间。 6、编写求字符串长度函数,不允许使用strlen或类似功能函数。 7、编写字符串拷贝函数,不允许...
15.4.4 虚析构函数 495 15.4.5 构造函数和析构函数中的虚函数 497 15.5 继承情况下的类作用域 497 15.5.1 名字查找在编译时发生 498 15.5.2 名字冲突与继承 498 15.5.3 作用域与成员函数 499 15.5.4 虚函数与作用域 ...
15.7.1 虚析构函数 552 15.7.2 合成拷贝控制与继承 552 15.7.3 派生类的拷贝控制成员 554 15.7.4 继承的构造函数 557 15.8 容器与继承 558 15.8.1 编写Basket类 559 15.9 文本查询程序再探 562 ...
15.7.1 虚析构函数 552 15.7.2 合成拷贝控制与继承 552 15.7.3 派生类的拷贝控制成员 554 15.7.4 继承的构造函数 557 15.8 容器与继承 558 15.8.1 编写Basket类 559 15.9 文本查询程序再探 562 ...
6.13 何时调用构造函数与析构函数 6.14 使用数据成员和成员函数 6.15 微妙的陷阱:返回对Private数据成员的引用 6.16 通过默认的成员复制进行赋值 6.17 软件复用性 6.18 有关对象的思考:编写电梯模拟程序的类...
8.4.4 基类和派生类的析构函数 8.4.5 医生也是人 8.4.6 关于派生类和基类构造函数的规则 8.5 多态和虚函数 8.5.1 多态——同一个接口,不同的行为 8.5.2 什么是虚函数 8.5.3 虚函数的作用 8.6 总结 8.7 练习 复习题...
6.13 何时调用构造函数与析构函数 6.14 使用数据成员和成员函数 6.15 微妙的陷阱:返回对Private数据成员的引用 6.16 通过默认的成员复制进行赋值 6.17 软件复用性 6.18 有关对象的思考:编写电梯模拟程序的类...