内联函数直接在头文件中定义。
string.h
#ifndef __MYSTRING_
#define __MYSTRING_
#include
class String
{
public:
string(const char* str = 0){}
String(const String* s) {}
String& operator=(const String& s){}
~String(){}
char* Data()const {return this->data;}private:char* data;};
ostream& operator<<(ostream& os,const String& s)
{
return os << s.Date();
}
#endif
//Big Three 三巨头:指的是 带指针的类的拷贝构造函数、拷贝赋值函数、析构函数。
浅拷贝:按值拷贝。
深拷贝:按内容拷贝,适用于有指针成员的类。
自赋值:a = a;
内存管理:栈、堆
栈:CPU自动管理。不需要程序员来管。
堆:操作系统的资源,需要程序员自己申请和自己释放。不释放会造成内存泄漏。
函数调用栈:用来防止函数内部局部变量、函数入口参数以及函数返回值等。
//global
Complex c3(3,4); data段。
void function()
{
Complex c1(2,3);
Complex* p = new Complex(1,2);//
delete p;
static Complex c4(3,5);
}
C++ 运算符 new的工作过程:先分配内存,然后调用 构造函数。
Complex* pc = new Complex(1,2);
new 《=等价于=》
Complex* pc;
void * mem = operator new (sizeof(Complex));//内部调用malloc();
pc = static_cast(mem);pc->Complex::Complex(1,2);
String* ps = new String("hello");
delete <<=等价于=>>
1、先析构。String::~String(ps);
2、再释放内存。 operator delete(ps);
delete[] 必须和 new []对应 不然会造成内存泄漏.
delete 和 new 对应。
static:类的静态数据成员,是类的所有对象共享的,它存储在 内存的静态数据区域,某一个类的对象修改了static数据成员,所有的类的其他对象都可见这种修改。
类的静态数据成员初始化只能在类外进行,如: int ClassName::m_static_data = 9;这个类似于全局变量的初始化。
类的静态函数没有this指针,因此只能访问类的静态函数或静态数据成员。
静态函数可以通过对象.fun_static()来访问。或者直接用类名::fun_static()调用。
单实例类---设计模式
模板类:
template Ttemplateclass B
{
}
模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了真正的代码可重用性。
模版可以分为两类,一个是函数模版,另外一个是类模版。
模板函数:引数推导。
运算符重载。
templateT min(T x,T y)
C++标准算法库:模板函数。通用算法库。
命名空间:包装一下代码、数据;便于隐藏,防止重名。
object based 基于类, 面向对象。