「学习笔记」 11.4 | 类和对象

一、类和对象

1.类类型

形式上的东西不用做记录。看看源代码,或者平时练习很快就能掌握。关于public等关键字也不予解释,这是自己已经懂了的。下面记录自己的疑问和难点。

1)和java不同的是,public,protected,private的作用范围是在出现下一个关键字之前延续的。java的这几个关键词可以对每一个成员函数或者成员变量进行修饰。C++中类(class)缺省成员变量或者函数类型是private,但是对于struct,缺省的就是public类型。java缺省则表示protected。

2)C++中了构造和函数和析构函数是可以缺省的

3)类型 类名::函数名称(参数列表){}。表示该函数从属于前面的类。::是解析操作符号,表示该函数是该类的成员函数

4)如果一个类在前面只是声明了,但是没有实现。那么下一个实现的类中的参数里面可以使用(类 对象),参数以外使用(类 对象)就会报错,即类类型的声明不能用于定义数据成员。

2.对象
2.1 构造函数

1)和java不同的是C++新建一个对象不用new,对成员函数和成员变量的使用方法就是加点调用。

2)和java一样,一个类需要使用构造函数对对象进行初始化。构造函数可以重载、没有返回值类型、缺省,至少公开一个构造函数。

3)构造函数的构造方式可以在堆、栈,也可以是动态的构造。而且构造函数只能在创建对象时系统自动调用,程序的其他部分不能直接调用。((java可以调用构造函数吗?)。但凡使用了有参构造函数,系统就不再生成缺省构造函数

4)如果想要构造函数不让外界构造,那么写在私有字段就好。

注:不建议写带缺省参数的构造函数

2.2 拷贝构造函数

仅限于构造一个已有对象的副本。完成从一个对象到另一个对象的动作 。

这个地方不是很了解。以后遇到再说

2.3 构造函数的初始化列表

初始化列表目的

1)在构造对象的时候,同步构造内部对象;

2)部分成员(常量和引用)只能初始化,不能赋值;

3)部分成员(类和对象)如果赋值,将导致两次构造。

  • 在分配内存时,调用缺省构造函数构造,然后执行构造函数体内的赋值语句再次构造,效率不佳。
  • 若类没有缺省构造函数,将会导致问题。

注意:成员初始化按照成员定义顺序,而不是初始化列表的顺序;必须保持初始化列表和成员定义列表顺序一致性,但允许跳过部分成员,若顺序不一致则会有部分成员得不到正确初始化。

2.3 对象的析构

  • 析构就是终止化,在对象声明周期结束的时候清除。自己定义析构函数用于释放对象中动态分配内存的目标数据对象,而系统定义的析构函数只会销毁目标对象而不会销毁对象指向的内存空间(造成内存泄漏)。析构函数中对内存空间(使用delete)进行释放,并将指针赋值空值
  • 析构函数必须是公开的
  • 对象析构使用析构函数
  • ~ 类名,无返回值类型(包括void),无参数。
  • 不想要其他对象进行析构,可以设置为私有的。
  • 析构函数可以系统动销毁对象时自动调用(销毁内存和数据),也可以由程序员进行调用(不涉及所销毁对象内存仅仅销毁数据)
  • 一个类可以有多个构造函数,只可以有一个析构函数
  • 没定义析构函数,系统会自动定义一个缺省析构函数
  • 构造函数、析构函数、拷贝构造函数,在程序员没有定义的时候系统会自动的生成。

2.4 对象数组

像普通数组一样定义和使用

三、类与对象的成员

3.1 内联函数(用于优化)

目的:程序优化,展开函数代码而不是调用

  • 注意事项
    在函数定义前使用inline关键字,仅在函数原型前使用此关键字无效
  • 内联函数必须实现在头文件中,因为编译器必须看见内联函数的代码才能在编译期间展开。
  • 在类定义中给出函数体的成员函数自动成为内联函数
  • 函数体代码量较大,或包含循环,不要使用内联函数。(空间可能还造成浪费)
  • 构造函数析构函数可能隐含附加操作,慎用内联
  • 内联函数只是一个建议,最终是否使用内联函数由编译器决定

3.2 常数据成员、函数

加const即可。只能初始化,不能进行赋值和改变

private: 
const int x;
类型 成员函数名称(参数列表) const;
//常成员函数:不能修改对象成员值的函数,常成员函数不能调用类的非常成员函数。

静态成员函数不能定义为常成员函数

对象是常量,则只能定义常成员函数

3.3 静态数据成员、成员函数

  • 只有一份,由该类所有对象共享
  • 仅声明,不在对象上分配空间
  • 声明直接在前面加static就可
  • 定义格式:类型 类名称::静态数据成员名称=初始值
  • 必须在外部进行初始化,初始化动作与访问控制无关
  • 静态成员函数没有缺省的this指针

3.4 单子模式

3.5 静态常数据成员

static const 类型 名称;

同样,内部声明外部初始化。外部初始化的时候省掉static

const 类型 类名::成员名称=初值;

3.6 友员函数和友元类

  • 友元:慎用!会破坏数据封装与信息隐藏
  • 用以访问私有、保护成员
  • 友缘可以是函数、其他类成员函数,也可以是类
  • 定义格式:friend 函数或类声明
  • 在java中使用反射机制访问私有、保护的成员数据
  • 友元关系不可逆,理解就是我给我的一个朋友B介绍了我的所有朋友,但是我得朋友们却对此一无所知。(我把别人当朋友,但别人不是这样)除非相互友元,才能相互访问私有
  • 不需要访问控制,public、private protected都行。

四、继承与派生

继承概念什么的和java没有什么区别

4.1 单继承

格式:class 派生类名称 : 派生类型保留字 基类名称{ … };

派生类保留字

public:派生类访问权限和基类成员访问权限一样,只是基类private类型派生类不可见(常用)

protected:基类public变成protected,基类protected变成protected,private不可见

private:protected和public变成private,而private不可见

编程习惯:将派生类需要频繁使用的基类数据成员设定为protected,设置为private访问太不方便。

4.2 函数覆盖与二义性

派生类的成员函数名称与基类相同,如果要使用基类的成员函数的话

解决办法:使用名解析的方法。对象.基类名::使用函数()

4.3 多继承

语法格式:class 派生类名称:派生类型保留字 基类名称1,派生类型保留字 基类名称2,…{};

导致的问题的问题比带来的好处多:一个派生类里面会包含很多基类的副本,基类副本的位置没有办法决定。因此编程中尽量不要使用。慎用!

java只有接口类可以实现多继承。普通类不能多继承,说明多继承是真的不好啊,java都摒弃了

4.4 虚基类(多继承)

A,B都继承C,D再继承A,B的时候就会拥有两个C的副本,虚拟继承((只和多继承有关))的目的就是为了让这样公共继承的类只有一份副本。

class A{public:void f();};
class B:virtual public A{public:void f();};
class C:virtual public A{public:void f();};
class D:public B,public C{ public:void f();};

4.5 派生类的构造函数与析构函数执行顺序

构造函数从基类到派生类

析构函数从派生类到基类

4.6 类的赋值兼容性

共有派生时,任何基类对象可以出现的位置都可以使用派生类对象代替。

  • 使用派生类对象仅给基类赋值
  • 使用派生类对象仅给基类对象引用初始化
  • 使指向基类的指针指向派生类对象,仅引领基类部分

保护派生和私有派生不可以直接赋值

尽量不要使用保护派生和私有派生(单继承共有派生)

4.7 多态

目的:不同的对象在接受到相同消息时做不同的响应。

对应同样成员函数名称,执行不同函数体

virtual关键字声明成员函数,派生类里面同名函数也是virtual类型的。一日为virtual,终生为virtual。所以只要是虚函数都加上virtual

派生类的和基类虚函数同名时,派生类的函数回复该基类的函数

纯虚函数

充当占位数,没有任何实现

派生类负责实现具体功能

声明格式:virtual void f(int x)=0;

抽象类

带有纯虚函数的类

作为类继承层次上的上层

保持多台性需要虚析构函数,以保证能够正确释放对象

五、散装问题、知识点

1.if(x)、if(!x),分别表示x不为空,x为空

2.拷贝构造函数的意义是什么?

3.使用Delete实际上是调用了析构函数

4.流操作和操作符的重载是什么?

5.学习一下如何使用百度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值