第二周 C++面向对象高级编程(上)Boolan

Classes的两个经典分类:

  • Class without pointer member(s)
    complex
  • Class with pointer member(s)
    string

String class

String class

String s3(s1); // s3初值为s1,拷贝
s3=s2; //拷贝,引发与刚才不一样的函数

编译器给的默认的可以用,就用
但是这里不可以用,用的话会传指针,不是真的复制。

Big Three,三个特殊函数

Big Three,三个特殊函数

动态分配,而不是在类里面放一个数组。
所以是一个指针。

不能用编译器的,所以要写出来。
234是比 Complex 新增加的,Complex 里不曾出现
2.String 接受的是自己这种东西,所以叫拷贝构造
3.复制的是自己这种东西,拷贝赋值

所有的类的定义,对 big3都不会加 const,因为必然要修改

ctor 和 dtor(构造函数和析构函数)

ctor 和 dtor(构造函数和析构函数)

2-1
要想到最后有一个结束符'\0'
最后一步,清理的函数。
动态内存,所以要清理。否则会造成溢出。
class 里有指针,多半要使用动态分配,有动态分配,就要在退出时释放这部分内存。

class with pointer members 必须有 copy ctor 和 copy op=(赋值assignment operator)

class with pointer members 必须有 copy ctor 和 copy op=(赋值assignment operator)

如果使用编译器默认,则在赋值时会拷贝指针,而不是数据。
看起来像是内容相同,但是 a 和 b 指向了相同的数据,改变 a 同时也会改变 b。

copy ctor(拷贝构造函数)

copy ctor(拷贝构造函数)

2-2
alias 叠名
是一件危险的事

copy assignment operator(拷贝赋值函数)

copy assignment operator(拷贝赋值函数)

2-3
赋值过程:
先把左边清空,然后建立一个和右边一样的空间,再把右边拷贝到左边。
首先,检测是不是自我赋值,不只是同名赋值,很可能是指针指向同一个类。如果相同,就直接返回指针。
然后再拷贝:

  1. 删掉
  2. 建立空间
  3. 拷贝内容


    赋值前
删掉
建立空间
拷贝内容

如果不检测自我赋值,会发生什么:

  1. 删掉了唯一值
  2. 无法建立空间,因为检测不出长度,出错
如果不检测自我赋值

output 函数

output 函数

要写操作符重载
有什么可以直接丢给 cout呢?有,写在 inline 里面的 get_c_str()

所谓 stack(栈),所谓 heap(堆)

所谓 stack(栈),所谓 heap(堆)

放在栈里的内容,在离开作用域后会自动删除
放在堆里的内容,需要自己手动删除

stack objects 的生命期

stack objects 的生命期

auto object

static local objects 的生命周期

static local objects 的生命周期

其生命在作用域结束之后仍然存在,直到整个程序结束。

globe object 的生命周期

globe object 的生命周期

heap objects 的生命周期

heap objects 的生命周期

new:先分配 memory,再调用 ctor

new:先分配 memory,再调用 ctor

绝大多数的 new 被分解为三个部分:

  1. 调用 operator new,其内部调用 malloc(n),分配内存的函数
  2. 转换类型
  3. 调用构造函数,全名是 Complex::Complex(this,i,j)
new:先分配 memory,再调用 ctor

delete:先调用 dtor,再释放 memory

delete:先调用 dtor,再释放 memory
  1. 执行析构函数~String(ps),删除字符串占用的空间
  2. 释放内存 operator delete(ps),调用free(ps)
delete:先调用 dtor,再释放 memory

动态分配所得的内存块(memory block),in VC

动态分配所得的内存块(memory block),in VC

VC调试中Complex占用的,复数占用8B,调试占用32+4,cookie,42,共52B,总共占用64B(必须是16的倍数)所以有34B 的填充物
Release Mode,8B,cookie 占用42,共16B
cookie 内容00000041,4代表4
16,1代表已分配
VC调试中String 占用的,指针占用4B,调试占用32+4,cookie,42,共48B,没有填充物
Release Mode,4B,cookie 占用4
2,共12B,总共占用16B,其中4B为填充物。

动态分配所得的 array

动态分配所得的 array

2-1
Complex* p=new Complex[3];

array new 一定要搭配 array delete

array new 一定要搭配 array delete

不正确的用法少了[],少了[]并不会发生array占用的内存泄漏。
有[]调用3次析构函数
没有[]调用1次析构函数,有两个并不回收

编程实例

class String
{
public:
    String(const char* cstr=0);
    String(const String& str);
    String& operator= (const String& str);
    ~String();
    char* get_c_str() const {return m_data;}
    
private:
    char* m_data;
};

inline
String::String(const char* cstr=0)
{
    if (cstr){
        m_data = new char[strlen(cstr)+1];
        strcpy(m_data,cstr);
    }
    else{ //未指定初值
        m_data = new char[1];
        *m_data= '\0';
    }
}

inline
String::~String()
{
    delete[] m_data;
}

inline
String::String(const String& str)
{
    m_data = new char[ strlen(str.m_data) + 1];
    strcpy(m_data,str.m_data);
}

inline
String& String::operator=(const String& str)//引用
{
    if (this == &str)//取地址
        return *this;
    //必须先判断是否自我赋值
    delete[] m_data;
    m_data = new char[ strlen(str.m_data)+1];
    strcpy(m_data,str.m_data);
    return *this;
}

进一步补充:static

进一步补充:static

静态成员函数没有 this pointer,所以不能使用 this pointer 的功能。

进一步补充:static

静态的变量要在外面赋初值

进一步补充:把 ctors 放在 private 区

进一步补充:把 ctors 放在 private 区

只用一次的函数。构造函数放在 private 中,

进一步补充:把 ctors 放在 private 区

只有第一次调用的时候才会定义,这以后就会存在,并且只会有一份。

进一步补充:cout

进一步补充:cout

进一步补充:class template,类模板

进一步补充:class template,类模板

进一步补充:function template,函数模板

进一步补充:function template,函数模板

把责任分开,很有必要
这种东西叫做算法

进一步补充:namespace

进一步补充:namespace
  • using directive
using namespace std;
  • using declaration
using std:cont;
  • 用全名

更多细节与深入

更多细节与深入
  • operator tyge() const;
  • explicit complex(…):initialization list{}
  • pointer-like object
  • function-like object
  • Namespace
  • template specialization
  • Standard Library
  • variadic template
  • move ctor
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容