C++笔试题整理

时间:2021-07-19 03:03:49

资料来源: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,使得这个类在内存中分配独一无二的地址。