侯捷c++ 面向对象(上)

一、C++编程简介

(1)基于对象:只有一个class的编程 object based
面向对象:几个class的编程 object oriented

(2)class的经典分类:

    class without pointer members ——>e.g: complex 复数
    class with pointer members  ——>e.g: string 字符串

(3)class之间的关系:继承inheritance、复合composition、委托delegation

(4)学习C++,分为学习C++语言 ,和C++标准库

(5)C++书籍:语言的书籍《C++Primer》第五版,《C++programming Language》第四版

 提高书籍:《Effective C++ Third Edition》及中文版   《The C++ Standard Library》《STL源码剖析》(STL是标准库的前身)

二、头文件与类的声明

(1)标准库以头文件的形式 存在,只需要include进去就好#include <*.h>

(2)C语言 #include<stdio.h> 或者 #include<cstdio>,而  C++:  #include<iostream>或者  #include<iostream.h>

(3)头文件的布局:

#ifndef __complex__

#define __complex__

  *******

##endif

 (4)class的布局:

         class header

         class body

三、构造函数

(1)inline函数:只要成员函数在class body里面定义,不需要显示声明,就是inline函数,而如果在body之外定义,要想成为inline函数,必须显示声明。是否成为inline函数,由编译器来决定,即使声明为inline function,也不一定编译器有能力使之成为inline function。

(2)access level 访问级别:public ,private ,protected

private:数据的部分用尽量用private

public:函数的部分,大部分用public

(3)构造函数 :创建一个对象的时候,构造函数自动被调用,构造函数可设置默然参数,并用冒号设置参数初始化列表:

pair(const T1& a, const T2& b) : first(a), second(b) {}

参数initializition list和在body里对参数赋值的区别:一个是参数初始化;一个是赋值,是一个执行的过程,多了计算量;

创建一个对象,可以有参数,也可以无参数,也可动态创建:complex *p = new complex(4);

class定义了多个构造函数,就是重载overloading

(4)友元函数:

四、参数传递和返回值

1、数据放在private里
2、参数用reference,是否用const
3、返回值用reference传
4、在类的body里的函数是否加const
5、构造函数 的 initial list

五、操作符重载与临时对象
1,、所有的成员的函数带有一个隐藏的参数“this”,谁调用这个函数谁就是 this

临时对象 complex() ——》typename();

2、在类外

Complex Complex::operator+=(complex &c2)

这个是成员函数 operator+= 的实现,所以需要 Complex:: ,具有this指针。例如:

inline complex&
complex::operator += (const complex& r)
{
  return __doapl (this, r);
}

而下面属于运算符重载,不是成员函数的时候,就没有Complex:: 。

inline complex
operator - (const complex& x, double y)
{
  return complex (real (x) - y, imag (x));
}

六、复习Complex类的实现过程

七、三大函数:拷贝构造,拷贝赋值,析构
构造函数
拷贝构造函数
拷贝赋值函数
析构函数
——》只要类带有指针,就一定需要 拷贝构造函数 和 拷贝赋值函数

浅拷贝——》拷贝构造函数 ,浅拷贝的影响:1、造成内存泄漏;2、造成有两个指针 指向同一块内存
深拷贝——》拷贝赋值函数 步骤:delete  ;new; strcpy;

class里面有默认的拷贝构造和拷贝赋值函数。如果自己不定义一个拷贝构造函数,在调用拷贝构造函数的时候,就会调用默认的浅拷贝构造函数,就会造成问题,所以一定要自己定义拷贝构造函数——深拷贝。

八、堆,栈与内存管理
1、static local objects的生命周期

static的生命周期 :object的对象在scope结束以后仍然存在,直到整个程序结束;
非static 的生命周期:object的对象在在scope结束以后就结束了。

global objects的生命周期:

对象 objects 生命结束,就是什么时候析构函数被调用:

2、new——》operator new。new动态创建对象,分三步:第一步,先转化为operator new 函数,申请分配内存。第二步,做类型转化。第三步,调用构造函数

delete ——》operator delete。删除对象,分两步:第一步,先调用析构函数,第二步,再调用operator delete函数。


3、带中括号[ ]的new[ ]叫做array new,带中括号[ ]的delete[ ]  叫做array delete。

 动态分配所得到的数组array:complex *p = new complex[3];

new []  ——》delete[] ——》表示调用几次析构函数
 new 字符串 ——》delete 指针

delete[n] :array new一定要调用array delete,delete[n]会调用n次析构函数,而delete仅调用一次。

九、复习String类的实现过程


十、扩展补充:类模板,函数模板,及其他
    (1)static :静态数据 不属于某一个对象,而非静态的是属于一个对象的,这种情况需要设置为静态数据。

            静态函数 没有this pointer,而非静态函数有 this pointer,可以用this去取数据,静态函数要处理数据只能处理静态数据。

静态数据一定要在class外面 定义。

    给变量赋值,使获得内存的过程叫定义。  


    (2)template:类模板  函数模板
    (3)namespace:

十 一、复合与继承
  (1)复合composition关系下的构造和析构:构造是由内而外,析构是由外而内 has-a,即先调用component的构造函数,再调用container的构造函数。

            计算内存的大小:复合类component的内存大小+container的内存大小

  (2)委托delegation,即composition by reference:在body中声明一个 带指针的 另一个类    composition by reference

       生命时间:  classA 用一个指针指向classB,需要的时候才调用classB,而不是一直拥有classB。

  (3)继承Inheritance:(三种继承方式:public protected private)is-a,继承主要搭配虚函数来使用

          函数的继承:指的是继承函数的调用权,子类可以调用父类的函数。

               计算内存的大小:先调用父类的构造函数,再调用子类的构造函数。先调用子类的析构,再调用父类的析构函数。

十二、虚函数与多态

(1)虚函数:virtual

纯虚函数:一定要重新定义。

(2)

 (A)Inheritance + composition下的构造和析构

 (B)delegation + Inheritance ——》 功能最强大的一种

 

十三、委托相关设计

 
————————————————
版权声明:本文为CSDN博主「_Leveon」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_29230261/article/details/83013153

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值