高质量C++/C编程指南
2021-06-20 20:03
标签:函数 关键字 保存 oid other The 计算 为什么 面试 1 有如下的c++类 String(const char *str = NULL); // 普通构造函数 private: // String的析构函数 char *GetString(void) return p; // 编译器将提出警告 char *GetString2(void) return p; 实际上就是 char p[] 与 char *p 的区别是什么? 3 重载,覆盖与隐藏 成员函数被重载的特征: (1)相同的范围(在同一个类中); (2)函数名字相同; (3)参数不同; (4)virtual关键字可有可无。 覆盖是指派生类函数覆盖基类函数,特征是: (1)不同的范围(分别位于派生类与基类); (2)函数名字相同; (3)参数相同; (4)基类函数必须有virtual关键字。 本来仅仅区别重载与覆盖并不算困难,但是C++的隐藏规则使问题复杂性陡然增加。这里“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下: (1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。 (2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。 4、编写类String的构造函数、析构函数和赋值函数(25分) 已知类String的原型为: 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个函数。 标准答案: // String的析构函数 String::~String(void) // 3分 { delete [] m_data; // 由于m_data是内部数据类型,也可以写成 delete m_data; } // String的普通构造函数 String::String(const char *str) // 6分 { if(str==NULL) { m_data = new char[1]; // 若能加 NULL 判断则更好 *m_data = ‘\0’; } else { int length = strlen(str); m_data = new char[length+1]; // 若能加 NULL 判断则更好 strcpy(m_data, str); } } // 拷贝构造函数 String::String(const String &other) // 3分 { int length = strlen(other.m_data); m_data = new char[length+1]; // 若能加 NULL 判断则更好 strcpy(m_data, other.m_data); } // 赋值函数 String & String::operate =(const String &other) // 13分 { // (1) 检查自赋值 // 4分 if(this == &other) return *this; // (2) 释放原有的内存资源 // 3分 delete [] m_data; // (3)分配新的内存资源,并复制内容 // 3分 int length = strlen(other.m_data); m_data = new char[length+1]; // 若能加 NULL 判断则更好 strcpy(m_data, other.m_data); // (4)返回本对象的引用 // 3分 return *this; } 要是那次面试碰到这个题,还真不知道自己是否能够写得完整哦. 高质量C++/C编程指南 标签:函数 关键字 保存 oid other The 计算 为什么 面试 原文地址:https://www.cnblogs.com/gdoupanguoqing/p/9686045.html
class String
{
public:
String(const String &other); // 拷贝构造函数
~ String(void); // 析构函数
String & operate =(const String &other); // 赋值函数
char *m_data; // 用于保存字符串
};
String::~String(void)
{
delete [] m_data;
// 由于m_data是内部数据类型,也可以写成 delete m_data;
//为什么呢????
}
2 以下两个函数的区别是什么?
{
char p[] = "hello world";
}
{
char *p = "hello world";
}
分别计算如下值就真相大白了, sizeof(p)