天天看点

C++学习笔记第二周(极客班)

C++学习笔记第二周(极客班) 

学习C++第二周了,总体来说还不错。 

这一周学习了BigThree 拷贝构造,拷贝赋值,析构 

当我们设计的类中的数据包含指针时我们就应该涵盖这三个函数如课程中的String类, 

class String 

public: 

String(const char*cstr=0);//构造函数 

String (const String &str);//拷贝构造 

String &operator=(const String &str);//拷贝赋值 

~String();//析构函数 

private: 

char *m_data;//定义指针则可以不用事先划出确定的空间来存放对象。 

}; 

此时涵盖这三个函数是为了可以正确的生成对象以及解除对象,假如使用默认的构造函数可能无法正确的构造出类对象,同样也无法正确delete对象,造成内存泄露等一些列问题。 

String(const String &str);该函数传入的是常量引用,那样函数就不会修改该对象数据; 

String &String ::operator=(const String &str) 

{ if(this==&str) 

return *this;//当对象是自己是直接返回对象本身,这里通过比较两者的地址来确定是否为自己赋值自己。假如这里缺少可能会导致程序出错。 

delete[]m_data;//删除m_data所值的内存对象。假如少了上面的if语句那么这里删除以后对象自己赋值自己就不成功了 ,因为将删除了指针所指向的内存,那么内存中存放的数据也就丢失了。 

m_data=new char(strlen(str.m_data)+1); 

strcpy(m_data,str.m_data); 

return *this; 

所谓stack & heap 

stack是村才与某个作用域的一块内存空间。当程序调用某个函数时,该函数的参数以及返回地址等就会存放于stack中,包括函数中的本地变量。 

heap 是有操作系统提供的一块global内存内存空间,程序可以动态的从中获得内存。在C++中通过new & delete 这一对关键词来分配和释放内存。当我们通过new分的一块内存时对应的就要delete[] 来释放这块内存。 

stack的生命周只是在其作用域内,离开作用域以后生命周期就结束了。如: 

class Complex{…}; 

.. 

{ Complex c1;} 

c1在离开上述作用域后,它的生命也就结束了。 

而heap的生命周期是在对应的delete[]之后,或者整个程序结束之后。 

static对象的生命周期在其作用域结束以后依然存在,直到程序结束为止。 

global 对象的生命周期是整个程序结束之后。

new 对象时先分配内存然后在调用构造函数来创建对象。 

delete :首先调用析构函数,然后释放由new生成的内存. 

static 的补充 

class Account 

public: 

static double m_rate; 

sratic void set_rate(cont double &x){m_rate=x;}//static 函数和static匹配用于为static 对象赋值 

}; 

static double m_rate=8.0;//当类内定义了static数据成员时,类的外部必须对该static数据成员进行定义。 

int main() 

Account::set_rate(5.0); 

Account a; 

a.set_rate(5.0); 

将构造函数放在private区 

class A 

public: 

staticA&getInstance(); 

setup(){…} 

private: 

A(); 

A(const A& rhs); 

… 

}; 

A & A::getInstance() 

static A a; 

return a; 

上面的程序也可以如下写: 

class A 

public: 

staticA&getInstance(return a); 

setup(){…} 

private: 

A(); 

A(const A& rhs); 

static A a; 

… 

};//上面的语句用于生成只有一个对象的类。当构造函数存在于私有区域时只能通过公有区域的static函数来访问和设置私有的static 对象. 

关于模板类 

很多时候我们生成的类有很多共有的属性此时就可以生成一个模板类。 

如 

template 

class complex 

public : 

complex (T r=0,T i=0) :re(r),im(i){} 

complex &operator+=(const complex&); 

T real ()const {return re;} 

Timag()const{returnb im;} 

private: 

T re,im; 

friend complex&_doapl (complex*,const complex &); 

}; 

complex c1(2.5,3.0); 

complexc2(2,6); 

.. 

}

继续阅读