转自:http://www.cnblogs.com/icemoon1987/archive/2012/10/01/2709572.html

1. 面向对象:对象、类、继承

 
2. 构造函数:
    • 类的数据成员不能在类定义时初始化(因为只是声明),要用构造函数
    • 构造函数分两步执行:初始化成员(初始化列表),执行构造函数
    • 当类成员没有默认初始化式时,需要用初始化列表显示表示(const 成员,引用)
    • 初始化成员的顺序,与成员在初始化列表中的顺序无关,按照成员定义顺序
    • 合成的默认构造函数不会初始化内置或复合类型成员(指针、数组)
    • 构造函数不能为 const,因为 const 成员函数不能修改类中成员
    • 构造函数不能为虚函数,因为需要确切的知道对象类型
    • 单个形参的构造函数:定义了从形参类型到类类型的隐式转换
    • 将构造函数声明为explicit (定义时不需要),可防止在隐式类型转换中调用构造函数
 
3. 复制控制:复制构造函数、赋值操作符、析构函数(当类具有指针成员时,几乎总是需要定义复制控制成员)
 
4. 复制构造函数:接受单个同类对象引用(const 引用,如果不加const,则不能用一个const变量拷贝构造一个普通变量)
    • 同一类型对象 显式或隐式 初始化一个对象        Myclass a(b); Myclass a = b()
      • 复制初始化:对象初始化时,只要没有显示调用构造函数,均先调用构造函数创建一个临时对象,然后再调用复制构造函数。
      • 直接初始化:直接调用与实参匹配的构造函数
      • 注意:只有在初始化的时候 = 采用复制构造函数,一般用 = 都是赋值操作符
    • 复制一个对象,将它作为实参传递给一个函数    void myfun( Myclass a)
    • 从函数返回时复制一个对象    Myclass myfun(void)
    • 初始化顺序容器中的元素(push_back元素时,也使用复制构造函数)        vector<string> svec(5);
    • 根据元素初始化列表初始化数组元素    Myclass a[] = {Myclass(1), Myclass(2),...}
    • 将构造函数声明为 explicit (定义时不需要),可防止在隐式类型转换中调用复制构造函数
    • 将复制构造函数定义为 private 可以防止复制(io类对象均不允许复制)
    • 默认的复制构造函数,将逐个复制成员,包括数组成员!!
 
5. 赋值操作符:    Sales_item& operator=(const Sales_item &)    如果不加const,则不能用一个const变量,赋值一个普通变量
 
6. 构造函数调用时机:
  • 一般构造函数:创建对象,隐式类型转换    a.same_item('abcde')
  • 拷贝构造函数:通过同类型对象初始化,函数参数,函数返回,容器与数组    Myclass a = b;
  • 赋值构造函数:赋值 a = b;     (其实已经没有构造功能了,因为赋值之前都构造好了,否则就是拷贝构造了)
 
 
7. 析构函数:
  • 无形参,不能重载,可以为 virtual
  • 三原则:如果需要定义析构函数,则要定义复制构造函数和赋值操作符
        
8. 重载操作符:
  • Sales_item operator + (const Sales_item &, const Sales_item &)
  • 不再有短路特性!
  • IO操作符必须为非成员函数,且设置友元
  • 强制类型转换()也是运算符的一种,也支持重载
  • 非类成员:单目操作符 --> 1个参数,                双目操作符 --> 2个参数
  • 类成员:    单目操作符 --> 没有参数,    双目操作符 --> 1个参数    (其中有一个默认为this指针)
 
9. 成员访问标号:
  • public:任意
  • private:类组成部分的代码,友元
  • protected:允许派生类访问
 
10. this指针:
  • this 指针本身为 const 指针,不能改变指向
  • const 函数的 this 指针是 指向const的const指针,都不能变
 
11. const 与 类:
  • const成员函数中的 this 指针指向一个 const 对象,所以不能修改任何数据成员
  • const 类对象只能使用 const 成员(???)
 
12. static 与 类:(相关示例见此处)
  • static 成员变量:位于数据区,为类共享,必须在类外部定义且仅定义一次(就像成员函数),可以直接采用类名访问
  • static 成员函数:可以在没有对象的时候使用!!不具有 this 指针!不能访问非static变量,不能为const,不能为虚函数(这两个都和this指针有关),单例模式实现的时候用到了。
  • const static 成员变量:可在类定义内部初始化,但仍然需要在外部定义一次。
  • static 成员即使被继承,也只有1个实例,如果子类修改了,基类也会看到这种变化!
 
13. 重载:
  • 基于形参类型,数量,函数是否为 const(不能基于返回值!)
 
14. 友元:
  • 允许一个类将其 private 成员的访问权授予指定函数或类
  • friend class window_Mgr;
  • friend void window_Mgr::relocate();
  • 友元不能被继承!!(允许访问基类,但不允许访问派生类)
 
15. 继承:
  • 派生类具有基类的一切(所占空间能表现出来),只是派生类的函数能不能访问而已
  • 派生类定义: class classname: access-label base-class    class Child: public Parent
  • 派生类的指针可以转换为基类指针(反正基类里的东西派生类都有),但基类的指针不能转换为派生类指针
  • 派生类不能将继承的变量的访问控制放松(?)
  • 继承类型(决定派生类能否使用基类资源):
    • 公有继承:            public -> public    protected -> protected (struct 默认继承方式)
    • protected继承:    public, protected -> protected
    • private继承:        public, protected -> private (class 默认继承方式)
  • 派生类的构造函数从最初的基类开始构造。详细说明见此处。
  • 各个类的同名变量是独立的,但是同名函数会形成覆盖!举例见此处。
  • 派生类的函数调用遵循就近原则,如果自己有相关函数,则调用自己的,如果没有,则父类,如果还没有,则祖父类
        
16. 多重继承:class Child: public Parent1, public Parent2
  • 构造函数:依照继承列表中基类的出现顺序调用(而不是子类构造函数初始化式中的顺序)
  • 析构函数:与构造顺序相反
  • 转换:派生类指针(引用)可转化为任意基类指针(引用),当出现二义性时,给出报警
  • 虚函数:只要函数名相同,就有可能导致二义性
 
17. 虚继承:class B : public virtual A

18. 虚函数:基类将 希望派生类重载的函数 声明为虚函数

  • 仅在声明时加 virtual,定义时不用
  • 析构函数一般为虚函数(为了解决多态下,析构函数与类型的动态绑定关系,在用指向派生类的基类指针进行析构的时候,应该要正确的执行派生类的析构 函数。析构函数是一类函数,只要基类为虚,派生类的析构函数就会重载掉基类的析构函数,并且在析构时,先执行派生类析构函数,再执行基类析构函数。并且, 只要基类析构函数为虚,派生类析构函数也继承为虚)
  • 若派生类不重载,则使用基类版本
  • 返回基类型引用的函数,可被重载为返回派生类引用
  • 动态绑定:由运行时引用或指针指向的对象决定!(而不是引用或指针本身的类型!!)
  • 派生类虚函数调用自身基类版本时,必须显示使用作用域操作符    Parent::fun();
  • 虚函数带默认参数:不具动态绑定性,根据指针或引用本身类型而定。
  • 虚函数的实现:
    • 编译器为具有 virtual 的类加入一个指向虚表(vtbl)的指针(vptr),需要占用一个指针的空间
    • 虚表保存指向本类的虚函数的指针
    • 调用时,先取出vptr,再找到vtbl,再通过vtbl,找到相应函数
    • 对虚函数加&,不能获得真正虚函数的地址,而是获得一段用来获取虚函数地址的程序的地址
  • 纯虚函数:在函数最后加 =0,如:double net_price(int) const = 0,抽象类,不能实例化
 
19. 重载 vs. 虚函数
  • 只要子类具有与基类相同的函数,就会覆盖基类中的函数
  • 重载在编译时确定,虚函数在运行时动态确定
  • virtual 函数为非 static 成员函数
  • 派生类虚函数与基类中的虚函数,类型、返回值都相同(或均返回指针或引用,基类返回基类指针,派生类返回派生类指针)
 
20. RTTI:Run-Time Type Information
  • dynamic_cast:用于在类层次结构中进行转化,比如派生类转化为基类,等等
  • typeid:获取一个对象或引用的确切类型。    typeid(*p)
21. 杂项:
  • struct,class 均用来定义类,class 默认 private,struct 默认 public
  • 在类内定义的函数被当做内联函数
  • 类的局部类型名定义: typedef std::string::size_type index;
  • delete 与 delete[]:
    • int *a = new int;        delete a;        只执行一次析构函数
    • int *a = new int[5];    delete[] a;     对整个数组中的各个元素执行析构函数

【转】C++的面象对象总结的更多相关文章

  1. javascript必知必会:面象对象编程

    面象对象编程技术的核心理念:封装.继承.多态:在一些主流的高级编程语言中,比如:C#,VB.NET,JAVA,PHP等都是很容易实现的,而如果要在javascript中实现面象对象编程,可就不那么直接 ...

  2. 面象对象设计原则之七:合成复用原则(Composition/Aggregate Reuse Principle, CARP)

    合成复用原则又称为组合/聚合复用原则(Composition/Aggregate Reuse Principle, CARP),其定义如下: 合成复用原则(Composite Reuse Princi ...

  3. 面象对象设计原则之六:迪米特原则(LeastKnowledge Principle, LKP)

    迪米特法则来自于1987年美国东北大学(Northeastern University)一个名为“Demeter”的研究项目.迪米特法则又称为最少知识原则(LeastKnowledge Princip ...

  4. 面象对象设计原则之五:依赖倒置原则(The Dependency Inversion Principle,DIP)

    如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要实现机制之一,它是系统抽象化的具体实现.依赖倒转原则是Robert C. Martin在1996年为“C++Reporte ...

  5. 面象对象设计原则之三:里氏替换原则(The Liskov Substitution Principle,LSP)

    里氏代换原则由2008年图灵奖得主.美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing教授于1994年提出.其严格表述如下:如果对每一个类型为S的 ...

  6. 面象对象设计原则之二:开放封闭原则(Open-Closed Principle, OCP)

    开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则.开闭原则由Bertrand  Meyer于1988年提出,其定义如下: 开闭原则(Open-Closed Principle, ...

  7. Java学习笔记9(面象对象9:多态)

    多态概述 多态是继封装.继承后,面对对象的第三大特性. 现实事物经常会出现多态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态. Java作为面向对象的语言,同样可以描述一 ...

  8. Python面象对象与类

    # -*- coding: utf-8 -*- # @Date: 2017-08-26 # @Original: from collections import namedtuple from col ...

  9. php面象对象魔术方法的使用

    class Moshu{ public $number; public function __construct($str)//构造方法,new实例时,自动调用 { //require('/confi ...

随机推荐

  1. HTML5给我们带来了什么?

    HTML5初探 传说中的HTML标准已经超过10年没有更新了,如今HTML5席卷全球,那么到底什么是HTML5呢?都在讲HTML5是web的新一代标准,它有着很多之前浏览器没有的新特性,可以说HTML ...

  2. ***PHP多线程pthreads 实现QQ号码爬虫

    通过空间历史浏览,爬出查看你空间的人(一般限制20人,除非开通黄钻),然后在爬出这20人的浏览记录,依次向下爬,你可以控制爬行深度.这里仅仅给出怕中代码片段,你可以进一步优化,将QQ分类存储.通过QQ ...

  3. easyui源码翻译1.32--Tree(树)

    前言 使用$.fn.tree.defaults重写默认值对象.下载该插件翻译源码 树控件在web页面中一个将分层数据以树形结构进行显示.它提供用户展开.折叠.拖拽.编辑和异步加载等功能. 源码 /** ...

  4. spring cloud官方文档提到的服务开发的12项要素。

    I. Codebase 从一个代码库部署到多个环境. II. Dependencies 使用显式的声明隔离依赖,即模块单独运行,并可以显式管理依赖. III. Config 在系统外部存储配置信息. ...

  5. idea快捷方式

    1. [常规] Ctrl + Shift + Enter,语句完成 "!",否定完成,输入表达式时按 "!"键 Ctrl + E,最近的文件 Ctrl+Shif ...

  6. 确保客户端可以接收到服务端的异常serviceDebug includeExceptionDetailInFaults="true"

    1.为了确保客户端可以接收到服务端反馈的异常 在服务端的配置文件中需要有 <system.serviceModel> <behaviors> <serviceBehavi ...

  7. WCF - Hosting WCF Service

    After creating a WCF service, the next step is to host it so that the client applications can consum ...

  8. Android开发之ListView-BaseAdapter的使用

    ListView优化原则: UI优化: listview条目与条目之间的间隙的分割内容 : android:divider="@android :color/transparent" ...

  9. Android开发UI之Toast的使用

    Toast,A toast provides simple feedback about an operation in a small popup. 对于操作提供一个简单反馈信息. 官网链接:htt ...

  10. ArrayList Iterator remove java.lang.UnsupportedOperationException

    在使用Arrays.asList()后调用add,remove这些method时出现 java.lang.UnsupportedOperationException异常.这是由于Arrays.asLi ...