资料来源:http://blog.csdn.net/dongfengsun/article/details/1541926
1.已知String类定义如下:
class String
{
public:
String(const char *str = NULL); // 通用构造函数
String(const String &another); // 拷贝构造函数
~ String(); // 析构函数
String & operater =(const String &rhs); // 赋值函数
private:
char *m_data; // 用于保存字符串
};
尝试写出类的成员函数实现。
答:
String::String(const char *str)
{
if ( str == NULL ) //strlen在参数为NULL时会抛异常才会有这步判断
{
m_data = new char[1] ;
m_data[0] = '\0' ;
}
else
{
m_data = new char[strlen(str) + 1];
strcpy(m_data,str);
}
}
String::String(const String &another)
{
m_data = new char[strlen(another.m_data) + 1];
strcpy(m_data,other.m_data);
}
String& String::operator =(const String &rhs)
{
if ( this == &rhs)
return *this ;
char* local_name = new char[strlen(rhs.m_data) + 1]; //local variable for exeception safety
strcpy(local_name,rhs.m_data);
delete [] m_data; //删除原来的数据,新开一块内存
m_data = local_name;
return *this ;
}
String::~String()
{
delete []m_data ;
}
2.new delete 与malloc free的联系和区别
答:
联系:
(1)二者均可用于内存的动态申请和释放;
(2)对于内部数据类型的对象(没有构造和析构过程)而言,他们是等价的。
区别:
(1)malloc 和free是C/C++的标准库函数;而new和delete是C++的运算符
(2)对于非内部数据类型的对象malloc和free无法满足动态对象的要求。因为对象在创建的同时需自动执行构造函数;在消亡的同时需自动执行析构函数,而malloc和free是库函数不在编译器控制权限之内,即编译器不能令其承担执行构造函数和析构函数的任务,故这时需求助于new和delete(他们是运算符,在编译器控制权限之内)。
总结一下:
malloc和free:动态申请内存和动态释放内存;new和delete:动态申请内存和动态释放内存 + 初始化和清除工作。
3.构造函数中的初始化列表和赋值的区别
答:
从概念上讲,可认为构造函数分为两个阶段执行:(1)初始化阶段;(2)普通的计算阶段(由构造函数函数体中的所有语句组成)。
不管其他成员是否在构造函数初始化列表中显示初始化,类类型的数据成员总是在初始化阶段进行初始化--使用该类的默认构造函数,即若此类没有默认构造函数,则必须在初始化列表中对其进行初始化。
无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对他们进行赋值。最终效果是一致的,其区别的重要性取决于数据成员的类型:
(1)类类型成员----使用默认构造函数
(2)内置和符合类型成员----依赖于对象的作用域:局部作用域成员不被初始化;全局作用域初始为0。注:对于const和引用类型的成员,也必须在构造函数的初始化列表中进行初始化------源于它们本身的特点:定义时必须初始化。
4.main函数执行之前,还会执行什么代码?
答:全局类对象的构造函数会在main之前执行(其析构函数会在main之后执行)。
那么是全局对象?
例子:(来源: http://topic.csdn.net/u/20080727/07/394f095b-6b07-4e6f-8b40-d0bc8b75e73f.html)
#include <iostream>
using namespace std;
class CPoint
{
public:
CPoint(int a)
{
this->a=a;
}
int a;
};
CPoint A(1); //这就是全局对象
int main()
{
cout<<A.a<<endl;
return 0;
}
5.若A是一个空类(即没有任何成员变量和函数),则sizeof(A)的值为?为什么?
答:1
因为:C++中,一个空类大小不是为空的,有一个隐讳的1字节,那时编译器安插进取的一个char,使得这个类在内存中分配独一无二的地址。