C++复习笔记2

函数重载(重定义)

是函数符号生成规则中的函数形参作为支持
函数重载就是对函数进行重定义
函数覆盖就是函数的重写

三要素

1.同名
2.不同参数
3.同一作用域

函数符号的生成规则

1.C

以函数名为生成规则

2.C++

以函数原型为为生存规则
  1. 返回值
  2. 函数名
  3. 函数形参(与函数重载有关)
    (1)参数个数
    (2)参数类型
    (3)参数顺序

其他:
【不同作用域可以存在同名变量】
【所有变量类型系统都可以进行强制转换,程序可以运行但有可能导致数据丢失,系统会提示警告】
【main中不能有同名函数,否则就近原则将调用main中的该函数而不调用外面的函数】

new和malloc

///
Cmalloc[void*malloc(size_t size)]free [void free(void*ptr)]
C++newdelete
new和malloc的区别
  1. new是关键字,malloc是函数
  2. new在自由存储区域开辟内存,malloc在堆上开辟内存
  3. new可以重载,malloc不能重载
  4. new可以调用malloc,malloc不能调用new
  5. 如果内存开辟失败,new抛出异常,malloc返回NULL(因为如果是空会开辟失败所以一般先判空)
  6. new可以开辟常量,malloc不能
  7. new可以以下两个函数做初始化,malloc不能
newmalloc
operator new(用来开辟内存)单纯开辟内存
constructor (初始化)

const

常量是一种标识符,他的值在运行期间恒定不变。c语言用#define来定义常量(宏常量)。C++除了#define海葵科哟用const来定义常量(const常量)。

C中const与C++中的const不同
  • C
    • 在C中const为常变量
      在编译阶段处理 常变量没有左值
  • C++
    • 在C++中const称为常量
      在编译阶段处理 把常量使用的地方替换常量初始值
    1. 一定要初始化
    2. 不允许左值(不允许在左边)
    3. 不允许间接访问来修改常量内存,杜绝间接访问的风险。
    • C中const修饰的全局变量 g
    • C++中const修饰的全局变量 l extern
  1. const的优点
    C++ 语言可以用const 来定义常量,也可以用 #define 来定义常量。但是前者比后
    者有更多的优点:
    (1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安
    全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会
    产生意料不到的错误(边际效应)。
    (2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。
  • 常函数
  • 【规则5-2-1】在C++ 程序中只使用const 常量而不使用宏常量,即const 常量完全
    取代宏常量。
  • 【const数据成员无法建立在整个类中恒定的常量,应使用类中的枚举常量来实现。】

枚举常量

摘自 《高质量C++C编程指南》

有时我们希望某些常量只在类中有效。由于#define 定义的宏常量是全局的,不能达
到目的,于是想当然地觉得应该用const 修饰数据成员来实现。const 数据成员的确是存
在的,但其含义却不是我们所期望的。const 数据成员只在某个对象生存期内是常量,而
对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其const 数据成员
的值可以不同。
不能在类声明中初始化const 数据成员。以下用法是错误的,因为类的对象未被创
建时,编译器不知道SIZE 的值是什么。

class A
{…
const int SIZE = 100; // 错误,企图在类声明中初始化const 数据成员
int array[SIZE]; // 错误,未知的SIZE
};
const 数据成员的初始化只能在类构造函数的初始化表中进行,例如
class A
{…
A(int size); // 构造函数
const int SIZE ;
};
A::A(int size) : SIZE(size) // 构造函数的初始化表
{
…
}
A a(100); // 对象 a 的SIZE 值为100
A b(200); // 对象 b 的SIZE 值为200
怎样才能建立在整个类中都恒定的常量呢?别指望const 数据成员了,应该用类中
的枚举常量来实现。例如
class A
{…
enum { SIZE1 = 100, SIZE2 = 200}; // 枚举常量
int array1[SIZE1];
int array2[SIZE2];
};

枚举常量不会占用对象的存储空间,它们在编译时被全部求值。枚举常量的缺点是:
它的隐含数据类型是整数,其最大值有限,且不能表示浮点数(如PI=3.14159)。

引用

引用就是别名(引用底层以指针作为支持)

  1. 引用一定要初始化
  2. 引用不能引用不能取地址的数据
  3. 引用不能改变
    【在语法层面没有语法可以实现改变引用】
int a=10;
int &b=a;
//&c=b;X
//c=b;X
/int c = b;X
  1. 引用变量只能使用引用变量所有引用的数据。

内联函数inline(本文件可见,一般写在头文件里)

编译阶段——在代码的调用点直接展开代码

inline与static修饰的函数的区别
  1. inline函数 在调用点直接代码展开
  2. static 函数符号
inline与宏的区别
  1. inline——编译 ——类型检查和安全检查
  2. 宏 ——预编译 ——无
  3. inline是一个更安全的宏
    【注意事项】
    1. 实现在.h文件
    2. 只在Release版本生效
    3. 是给编译器的一个建议(采不采纳建议编译器说了算)
    4. 基于实现,不是声明
    5. 递归、循环、switch不使用(??)
inline的缺点

以代码膨胀为代价 空间换时间

建议:
  1. 开栈的开销 > 执行的开销 建议设置为inline
  2. 开栈的开销 < 执行的开销 不建议设置inline

函数的默认值

  1. 自右向左依次赋于
  2. 默认值不能重复赋予
  3. 一般赋在声明上

C和C++的相互调用

extern “C” C++独有

  • C++调用C
    C++源文件里加上 extern “C”
  • C调用C++
    C++源文件里可修改 extern “C”
    C++源文件里不可修改 加中间层 .cpp
  • 不明确编译器
    ifdef__cplusplus(系统自带宏)

namespace

名词作用域(防止名词冲突)
using namespace std; //using指示符暴露名词空间作用域下的所有符号
using std::cout;//暴露名词空间作用域下的单个符号。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值