C++ OOP Feature Conclusion (更新中)

Posted Charles Chou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ OOP Feature Conclusion (更新中)相关的知识,希望对你有一定的参考价值。

目录

1.类与对象

       1.1 基本概念(继承、封装、抽象、多态)

        1.2类的声明

        1.3成员函数(对象所占空间取决于数据成员,和成员函数无关)

        1.4数据成员(不能在类中初始化)

        1.5构造与析构函数(自动执行,顺序为栈)

        1.6对象的定义

        1.7对象数组(析构过程为栈)className instances[size] =Obj1(),Obj2(...),...

        1.8对象指针(this)

        1.9对象成员的访问(成员运算符访问、指向运算符访问、引用)

        1.10对象与const

       1.11 对象的动态创建与释放 className *instance = new className(params...)  ; delete instance

        1.12对象的赋值与复制

2.继承与派生(派生会自动屏蔽基类同名成员;)

        2.1基本概念(三种继承方式)

       2.2 单继承

        2.3派生类构成

        2.4访问属性

        2.5构造与析构(先执行基类构造,后执行基类虚构)

        2.6多继承 class className:limitation baseClass1,limitation baseClass2...

        2.7对象关系(派生类可以赋值给基类)

3.多态与虚函数

        3.1基本概念(编译时多态、运行时多态)

        3.2向上类型转换

        3.3功能早绑定(编译阶段)

        3.4功能晚绑定(运行阶段,虚函数:virtual returnType functionName (params...))

        3.5虚析构函数

        3.6虚函数与重载的区别(p177)

        3.7纯虚函数与抽象类

4.友元与静态

        4.1基本概念

        4.2友元函数 friend returnType functionName(params...) 在类中声明 

        4.3友元类 friend className

        4.4静态数据成员(只能在类中声明,类外初始化)

        4.5静态成员函数(没有this指针,不能访问非静态成员,除非传入对象)

5.运算符重载

        5.1基本概念

        5.2重载规则

6.泛型编程

       6.1 基本概念

       6.2 函数模板

        6.3类模板

7.STL


1.类与对象

       1.1 基本概念(继承、封装、抽象、多态)

                类

                对象

                访问限制符

        1.2类的声明

        1.3成员函数(对象所占空间取决于数据成员,和成员函数无关)

        1.4数据成员(不能在类中初始化)

        1.5构造与析构函数(自动执行,顺序为栈)

                构造函数(系统提供默认构造函数)

                        参数初始化表

                        重载

                析构函数(只能有一个,不能重载,无参)

                        全局对象的调用时间

                        局部对象的调用时间

                        静态局部对象调用时间

        1.6对象的定义

        1.7对象数组(析构过程为栈)className instances[size] =Obj1(),Obj2(...),...

        1.8对象指针(this)

        1.9对象成员的访问(成员运算符访问、指向运算符访问、引用)

        1.10对象与const

                常对象(无法调用非const成员函数) const className instance()  | className const instance()

                常对象成员

                        常成员函数(只能访问数据成员,不能修改) returnType functionName(params...) const

                        常数据成员

                指向对象的常指针(不能修改指针)className * const pointerName = &instance

                指向常对象的指针(常对象只能用指向常对象的指针,不能使用普通指针)const className * pointerName

       1.11 对象的动态创建与释放 className *instance = new className(params...)  ; delete instance

        1.12对象的赋值与复制

                赋值(赋值运算符 = 默认重载,含指针数据成员的类必须自己实现运算符重载,否则产生指针悬挂问题 )object1 = object2

                复制(拷贝构造函数:className (const className &obj)) className instance(instance1) |  className instance = instance1

                两者异同:

2.继承与派生(派生会自动屏蔽基类同名成员;)

        2.1基本概念(三种继承方式)

       2.2 单继承

        2.3派生类构成

        2.4访问属性

        2.5构造与析构(先执行基类构造,后执行基类虚构)

                构造 className(params...):baseClass(paramValue...)

        2.6多继承 class className:limitation baseClass1,limitation baseClass2...

        2.7对象关系(派生类可以赋值给基类)

3.多态与虚函数

        3.1基本概念(编译时多态、运行时多态)

        3.2向上类型转换

        3.3功能早绑定(编译阶段)

        3.4功能晚绑定(运行阶段,虚函数:virtual returnType functionName (params...))

        3.5虚析构函数

        3.6虚函数与重载的区别(p177)

        3.7纯虚函数与抽象类

                纯虚函数 virtual returnType functionName(params...) =0

                抽象类 (具有一个纯虚函数的类为抽象类,只能作为接口,不能生成对象)

4.友元与静态

        4.1基本概念

        4.2友元函数 friend returnType functionName(params...) 在类中声明 

        4.3友元类 friend className

        4.4静态数据成员(只能在类中声明,类外初始化)

        4.5静态成员函数(没有this指针,不能访问非静态成员,除非传入对象)

5.运算符重载

        5.1基本概念

        5.2重载规则

6.泛型编程

       6.1 基本概念

       6.2 函数模板

                函数模板定义

                函数模板实例化(编译器自动识别)

                模板参数(注意:c++不对模板参数做任何类型转换,需要手动转换。不能提供参数默认值)

                模板函数重载(指的是模板函数也可以被普通函数重载)

        6.3类模板

                类模板定义

                类模板实例化(className<TypeName> instance)

                类模板参数(可以提供参数默认值,只能放在形参表的最右端,否则出错)

7.STL

        algorithm.h

        deque.h(双向队列)

        functiona.h

        iterator.h

        vector.h(向量)

        list.h(双向链表)

        map.h(键值映射)

        memory.h

        numeric.h

        queue.h(队列)

        set.h(不重复集合和可重复集合)

        stack.h(堆栈)

        utility.h

指针与继承的关系 c++ oop

【中文标题】指针与继承的关系 c++ oop【英文标题】:Relationship between pointer and inheritance c++ oop 【发布时间】:2018-10-10 20:48:38 【问题描述】:

谁能写一段c++的简短代码,说明指针和继承之间的关系。

我相信下面的代码是指我的问题

class Animal  
  public:   
    virtual void MakeSound(const char* pNoise)  ...    
    virtual void MakeSound()  ...  
;

class Dog : public Animal  
  public:   
    virtual void MakeSound() ... 
;

int main()    
  Animal* a = new Dog();   
  Dog* d = new Dog();  
  a->MakeSound("bark");   
  d->MakeSound("bark"); // Does not compile  
  return 0; 

【问题讨论】:

【参考方案1】:

您隐藏基类MakeSound 并覆盖其他MakeSound,因此它不参与重载决议。在 Dog 中覆盖两者或都不覆盖,或者将其中之一重命名为 MakeNoise

【讨论】:

有人可以用完整的代码分享一个正确的解决方案吗? 解决什么问题?您发布了格式错误的程序,我列出了 3 种修复方法。 你能告诉我好不好用吗?虚空 MakeSound() ; int main() Animal* a = new Dog();狗* d = 新狗(); a->MakeSound("吠声"); d->MakeNoise("吠声"); // 不编译 return 0; 如果你真的想要,你可以拨打d-&gt;Animal::MakeSound("bark"),但我不认为这是推荐的做法【参考方案2】:

这两者实际上几乎没有什么关系,一个交叉点是为了利用多态行为(虚拟成员),您必须使用指针或引用。如果您将派生实例分配给实际的基实例(而不是将派生的地址分配给基指针或使用派生实例初始化基引用),那么任何派生功能都将简单地丢失(通常称为该对象切片)。

请注意,在您的示例中,没有太多指向虚拟 void make_sound(char const *),更常见的是使用虚拟 void make_sound() 形式,并且派生类型知道要产生什么样的声音.

【讨论】:

你能推荐一个详细的代码来满足我的要求吗?

以上是关于C++ OOP Feature Conclusion (更新中)的主要内容,如果未能解决你的问题,请参考以下文章

指针与继承的关系 c++ oop

OOP 面向对象编程:由 C语言到 C++

需要 OOP C++ 帮助[关闭]

C++笔记--面向对象(OOP)编程基础--函数模板类模板

如何在 c++ OOP 中显示我的 ID 姓名年龄

C++笔记--面向对象(OOP)编程基础--STL入门与使用