乐趣区

关于c++:C核心编程

title: C++ 外围编程
categories:

  • [C++]

tags:

  • [编程语言]

date: 2021/03/11

作者:hackett

微信公众号:加班猿

内存散布模型

  1. 堆区:new/delete,由程序员调配和开释,若程序员不开释,程序完结由操作系统回收
  2. 栈区:寄存函数的参数值,局部变量等;由编译器主动调配开释
  3. 动态存储区:寄存全局动态变量、部分动态变量、全局变量以及虚函数表
  4. 常量存储区:全局常量、函数指针、常量数组、对函数指针
  5. 代码区:寄存函数体的二进制代码

援用

  1. 必须初始化,初始化后不可扭转
  2. 常量援用润饰形参
  3. 实质是一个指针常量

函数

  1. 默认参数(语法:返回值类型 函数名(参数 = 默认值){})
  2. 函数占位参数(语法:返回值类型 函数名(数据类型))
  3. 函数重载:
  • 同一作用域下
  • 函数名雷同
  • 函数参数类型不同 / 个数不同 / 程序不同

构造函数

能够有参数,因而能够产生重载

调用对象时主动调用结构,无需手动调用,而且只会调用一次

调用规定

如果用户定义有参构造函数,c++ 不在提供默认无参结构,然而会提供默认拷贝结构

如果用户定义拷贝构造函数,c++ 不会再提供其余构造函数

虚析构和纯虚析构

虚析构

语法:virtual ~ 类名 (){}

纯虚析构

语法:virtual ~ 类名 () = 0; 抽象类,无奈实例化对象

共性

解决父类指针开释子类对象

都须要有具体的函数实现

深 / 浅拷贝

浅拷贝:简略的复制拷贝操作

深拷贝:在堆区从新申请内存,进行拷贝操作;属性有在堆区开拓的,肯定要本人提供拷贝构造函数,避免浅拷贝带来的反复开释堆区问题

初始化列表

语法:构造函数():属性 1(值 1),属性 2(值 2),属性 3(值 3)…

动态成员

动态成员变量

所有对象共享同一份数据

在编译阶段分配内存

类内申明,类外初始化

动态成员函数

所有对象共享一个函数

动态成员函数只能拜访动态成员变量

this 指针

定义

this 指针指向被调用的成员函数所属的对象

this 指针是隐含每一个非动态成员函数内的一种指针

用处

形参和成员变量同名时,能够用 this 指针来辨别

在类的非动态成员函数中返回对象自身,可应用 return *this

const

常函数

const 在成员函数后:void func() const{}

常函数内不能够批改成员属性

成员属性申明前加 mutable 关键字,在常函数中仍然可批改

常对象

const 在申明对象前

常对象只能调用常函数

友元 friend

作用:让一个类或者函数拜访另一个类中的公有成员

全局函数

成员函数

运算符重载

加号

实现两个自定义数据类型相加

左移

能够输入自定义数据类型(配合友元)

递增

实现本人的整型数据(前置递增返回援用,后置递增返回值)

赋值

类中有属性指向堆区,做赋值操作时也会呈现深浅拷贝问题

关系

让两个自定义数据类型对象进行比照操作

函数调用

应用形式十分像函数的调用,因而称为仿函数,没有固定写法,非常灵活

继承

继承形式

public

继承下来的成员属性放弃不变

protected

继承下来的成员属性变为 protected

private

继承下来的成员属性变为 private

对象模型

父类公有成员被子类继承下来,被编译器暗藏后拜访不到

结构和析构程序

先调用父类的构造函数,再调用子类的构造函数,析构是先调用子类的析构函数,再调用父类的析构函数

同名成员 / 动态成员解决

拜访子类:间接拜访

拜访父类:加作用域

多态

满足条件

有继承关系

子类重写父类中的虚函数

动态多态

函数重载和运算符重载属于动态多态,复用函数名

函数地址早绑定 — 编译阶段确定函数地址

动静多态

派生类和虚函数实现运行时多态

函数地址晚绑定 — 运行阶段确定函数地址

应用条件

应用 父类指针 / 援用 指向子类对象,不能应用对象

纯虚函数和抽象类

语法:virtual 返回值类型 函数名(参数列表)= 0

特点

无奈实例化对象

子类必须重写抽象类中的纯虚函数,否则也属于抽象类

文件

文本文件

写文件:ofstream 或者 fstream 类

读文件:ifstream 或者 fstream 类

二进制文件

写文件:ostream& write(const char * buffer,int len);

读文件:istream& read(char *buffer,int len);

模板

函数模板

作用:建设一个通用函数,函数的返回值类型和形参类型能够不具体制订,用虚构的类型来示意

语法:template<typename T> 函数申明或定义

调用规定

如果函数模板和一般函数都能够实现,优先调用一般函数

如果函数模板能够产生更好的匹配, 优先调用函数模板

能够通过空模板参数列表来强制调用函数模板

函数模板也能够产生重载

类 模板

作用:建设一个通用函数,类中的成员数据类型能够不具体制订,用虚构的类型来示意

语法:template<typename T> 类

创立机会

一般类中的成员函数一开始就能够创立

类模板中的成员函数在调用时才创立

如果你感觉文章还不错,记得 ” 点赞关注

关注我的微信公众号【 加班猿 】能够获取更多内容

退出移动版