7.三大函数 拷贝构造 拷贝赋值 析构
#ifndef _MYSTRING_
#define _MYSTRING_
code
#endif 首先是防卫式声明
如果 class带有指针 那么不能使用编译器的自带拷贝功能
class with pointer members --> copy ctor /copy operator assignment
既可以在类的声明中,也可以在函数定义中声明缺省参数,但不能既在类声明中又在函数定义中同时声明缺省参数。!!!!!!!!!!!!缺省参数只能有一个声明。
像视频中那样声明和定义都有缺省参数是不行的!!!
拷贝赋值的时候
要考虑自我赋值的情况
当设计拷贝赋值的时候
8. 堆,栈与内存管理
char* get_str()const { 这里如果不加const 的话
return m_data;
} //下面编译就过不了 因为下面定义的是 const 类型的a 自然不能有个可以允许修改的函数调用?
std::ostream& operator<<(std::ostream& os,const String&a){
std::cout<<a.get_str(); //c语言中可以输出一个字符数组
return os;
}
用new 出来的对象不会随着scope结束而中结
complex stack object /auto object/
写成static complex c2(1,2); 离开大括号的时候还在的。
写在任何大括号之外的变量 未grobal objetct 全局有效
delete 一个指针
complex*p= new complex;
这样离开作用域的时候p会死掉 但是complex不会;
new
先分配memory 在调用ctor copy strucor
void *men=operator new(sizeof(complex)); 内存分配 调用malloc;
pc=static_cast<complex*>(men); //指针的转型操作 指针的转型
pc->Complex::Complex(pc/*隐藏参数*/,1,2);
delete
先调用析构函数
delete ps;
String::~String(ps);//内部调用析构函数; 自己杀掉多余的部分
operator delete(ps);//释放内存//调用free;
有中括号的new 称为 array new 有中括号的new 要搭配有中括号的delete array delete;
有中括号会多次调用析构函数
析构函数调用不够 就会memery leak
10.拓展补充 类模板 函数模板 及其他
1.静态 static
c1.real() ====》》 complex::real(&c1) 编译的角度
在编译器中 成员函数只有一个 this未隐式的参数 可以在函数里面用它
static 脱离了对象 在内存种单独有一份
class Account{
public :
static double m_rate;
static void set_rate(const double &x){m_rate=x}
};
double Account::m_rate=8.0;这是必须的
int main{
Account::set_rate(9.0);
Account a;
a.set_rate(7.0);
以上两种设置static 变量的方法都是可行的
}
2.cout;
3.类模板
template<typename T> 告诉编译器T目前还没有绑定
class complex{
。。。
}
使用的时候这样
complex<double> 会进行替换;
4.function template
经典代码
template<class T> 这里和 typename 相通
inline T& min(T& a,T&b){
return a>b? b:a ;
}
5.namespace
namespace std{
}
using directive //全部打开
using namespace std
using declearation//打开一个
using std::cout;
直接使用(
std::cin<<
11面向对象编程
1.Composition(复合)
设计模式adapter
构造由内而外
析构由外而内
2.Delegation(委托) Composition by reference
3.inheritance(继承)搭配虚函数
non-virtual 不希望被重载 void objected()const;
virtual 希望被重载 virtual void error(const std::string& msg);
pure vitual 一定要被重新定义 virtual void draw()const=0;
在成员函数前加上virtual 便成为虚函数
函数继承调用权
语法
template<typename _tp>
struct _List_node
: public _List_node_base
{
_tp _M_data;
};