1,拷贝构造
String s3(s1); // 以s1为蓝本设定到s3上
2,拷贝赋值
s3 = s2;
3,如果没有自定义拷贝构造和拷贝赋值,编译器会自动生成,但是默认的拷贝构造和拷贝赋值只会很忠实的一个bit一个bit的拷贝过去,对于复数够用;但是对于带有指针的则不是很好,因为对于指针赋值,是两个指针指到同一个地方,而不是真正的拷贝,这个是浅拷贝,而且容易引起内存泄漏
4,只要类中有定义指针,一定要写拷贝构造和拷贝赋值函数
5,析构函数
当离开作用域的时候,析构函数会被自动调用
如果没有这个析构函数,动态分配的内存就会造成内存泄漏了
6,字符串两种表示方法
1,有长度和字符两个信息
2,在字符的结尾有一个'\0'结尾
7,strlen计算的值不包含结束符
8,如下两种方式都调用了拷贝构造函数,行为一毛一样
String s2(s1); String s2 = s1; 而“String s2; s2 = s1;”调用的是拷贝赋值函数
9,检测自我赋值----效率高,不仅仅效率高,如果不这样,还可能会出错
if(this == &str) return *this;
10,stack(栈)
是存在于某作用域(scope)的一块内存空间。例如当调用函数,函数本身即会形成一个stack用来放置它所接收的参数,以及返回地址。
在函数本体内声明的任何变量,其所使用的内存块都取自上述stack。
11,heap(堆)
是由操作系统提供的一块global内存空间,程序可动态分配从其中获得若干区块
12,array new 一定要搭配 array delete
13,static
1,class里的static数据只有一份,银行户头,利率对于所有人都一样
2,class里的static函数没有this,只能处理静态数据
3,静态数据需要在外部定义
4,静态函数可以通过object调用和通过class调用
14,把ctors放在private区
静态数据只有一份
静态函数被class调用
返回对象调用setup函数
Singleton
class A
{
public: static A& getInstance( return a; ); setup() { ... } private: A(); A(const A& rhs); static A a; ...
};
调用方式:A::getInstance().setup();
Meyers Singleton class A { public: static A& getInstance(); setup() { ... } private: A(); A(const A& rhs); ... }; A& A::getInstance() { static A a; return a; }
调用方式:A::getInstance().setup();
15,类模板会造成代码的膨胀
16,函数模板---类模板中的关键字typename和函数模板中的class是相通的,都一样
template <class T> inline const T& min(const T& a, const T& b) { return b < a ? b :a; }
17,namespace
防止重名
namespace std { ... }