面向对象高级编程(上)-- 第二周学习笔记(Boolan)

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
{
    ...
}

 

posted on 2018-01-14 16:37  三万八千里  阅读(116)  评论(0编辑  收藏  举报

导航