您的位置:首页 > Web前端

剑指offer笔记(一)

2015-11-05 09:32 525 查看
1.定义一个空的类型,里面没有任何变量和成员函数,对该类型求sizeof,得到的结果是1,如果加构造和析构函数,结果还是1,如果是虚析构的话,就是4.(32位的系统)

32位系统,vc编译器中,short占 2 字节,int 、float、long 都占 4 字节,只有double 占8 字节

2.程序题:

#include <iostream>
using namespace std;

class my_test
{
public:
my_test(int n){a=n;};
my_test(my_test other){a=other.a;}
~my_test(){};
int add() const
{
return a;
}
private:
int a;
};
int main()
{
my_test my1(10);
my_test my2=my1;
my2.add();
return 0;
}由于拷贝构造函数没有用引用或者是指针,使用的是值传递,这样导致在进行拷贝构造是会无休止的一直拷贝下去,用指针的话,就是用地址传进去。

3.为拷贝构造函数添加赋值运算符

class my_test
{
public:
my_test(char *pData=NULL);
my_test(const char &str);
~my_test(){};
private:
char *m_pData;
};
my_test & my_test::operator =(const my_test &str)
{
if (this!=&str)
{
delete []m_pData;
m_pData=NULL;
m_pData=new char[strlen(str.m_pData)+1];
strcpy(m_pData,str.m_pData);
}
return *this;
}
这里考虑了四点:1.返回值是类型的引用,这样可以保证连续赋值。2.输入参数是常量和引用,保证输入数据被不会被改变,引用的话就可以省的在调用构造函数。3.先删除原来的数据,防止内存泄露。4.判断是否输入和原来的一样,一样的话,就不用再重新构造一份了。

改进版:考虑申请内存的时候没申请到,而且原数据也删除了,这样会出错。

my_test & my_test::operator =(const my_test &str)
{
if (this!=&str)
{
my_test my3(str);
char *temp=my3.m_pData;
my3.m_pData=m_pData;
m_pData=temp;
}
return *this;
}
4.c++中的struct和class的区别:两者实则没有什么很大的区别,只是struct默认是public,而class默认是private而已。在c#中,struct和class都是private,只是struct是值,class是引用,分配的内存位置不同,struct的实例在栈中,class的实例在堆中。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: