深入了解C++:形参、内联、重载、引用、const和指针、new和delete

简介: 深入了解C++:形参、内联、重载、引用、const和指针、new和delete

形参带默认值的函数

1.给默认值的时候从右向左给。

2.定义出可以给形参默认值,声明也可以给形参默认值。

3.形参默认值只能出现一次。

4.参数调用的效率问题

#sum(10,20)对应了五条汇编指令
mov eax,dword ptr[ebp-8]
push eax
mov ecx dword ptr[ebp-4]
push ecx
call sum
#如果调用sum(10)或sum(),则使用默认参数的形参无需mov。

内联函数

普通的函数调用过程会产生的开销:参数压栈、函数栈帧的开辟和回退过程。

如果是大型函数,这些开销尚可无视,但是对于简单函数,这些开销可能就远远大于函数内部的指令的开销了。

Inline内联函数:在编译过程中,就没有函数调用开销了,在函数的调用点会被建议直接把函数代码进行展开处理。文件的符号表中也不会出现inline函数,但是不是所有的inline都会被编译器处理成内联函数,比如递归,inline只是一个建议。

实务注意:debug版本上,inline是不起作用的,在debug的时候把代码展开要出事的;inline只有在release版本下才能拿出现。

Inline内联函数的普通函数的区别:内联成功的函数,少了函数调用开销,不在符号表中出现。

函数重载

定义:一组函数,其中函数名相同,参数列表的个数或类型不同,则称为函数重载。所以如果仅仅是返回值不同的函数不叫函数重载。一组函数称得上重载,一定是先处在相同的作用域当中的。Const或volatile的时候

C++为什么支持函数重载?

C++在产生符号的时候,是函数名+参数列表类型组成的。C语言产生函数符号的时候,是根据函数名产生的。

函数重载与多态的关系?

多态可以分为静态多态与动态多态。其中静态多态是在编译时期就确定了同名函数所采用的定义(形态),也就是函数重载。

C++和C的相互调用?

C++调用自定义C函数:把C函数的声明扩在extern C里面。

C调用自定义C++函数:把C++函数的源码扩在 extern C里面。

引用

引用和指针的差别

引用是一种更安全、更简单的指针。

1.引用是必须要初始化的,相比起指针不会有空转的可能。在汇编层面语法并无差别。

2.引用只有一级引用,指针可以有一级指针也可以有多级指针。

数组的引用

int array[5] = {};
int (&q)[5] = array;

左值引用

它有内存,有名字,可以放在赋值号左边进行修改的就是左值。它可以出现在等号左边和右边。

int a = 10; 
int &b = a;//a和b都是左值

右值引用

没内存,没名字。指令上必须先产生一个临时量放在寄存器中,使用完毕就从内存中删除。只能出现在等号右边的值。

int &&c = 20;//20是右值
const int &tem = 20;//20是右值。

右值引用变量本身是一个左值,只能用左值因引用来引用它。

不能用一个右值引用变量来引用一个左值。

const

C语言中的Const修饰的变量不能再作为左值。如果没有初始化可能会报错,可能会采用原内存空间的值,具体看编译器。Const被修饰的值叫做常变量,除了不能作为左值,其他规则和普通的变量没有差别。注意,只是不能通过这个常变量作为左值去修改值,但是可以通过提取常变量的内存空间的地址,再通过这个地址间接去修改这个常变量的值。

C++中的const必须初始化。如果初始值是一个立即数,所有出现const常量名字的地方(也就是可以把它当常量使用的地方),在编译的时候都被常量的初始化替换,这个功能类似于宏替换。但是程序运行的时候,这个被修饰的变量,性质就和C语言中一样了。如果初始值是一个变量,性质也和C语言中一样了。

C++中const修饰的经常出现的错误:

  1. 把修饰的量作为左值。
  2. 把修饰的量的地址泄露给普通变量(如果要泄露给普通变量需要做类型转换)。

C++中的Const 与一级指针的结合

C++的语言规范:const修饰的是离它最近的数据类型。

#const int *p和int const *p限制的int
const int x = 5;
const int *p = &x;
*p = 10; // 错误:试图修改指向的值
p++;     // 正确:修改指针本身
#int *const p限制的是int *
int x = 5;吗不能、‘’
int *const p = &x;
*p = 10; // 正确:修改指向的值
p++;     // 错误:试图修改指针本身

const如果右边没有指针*的话,const是不参与类型的。

比如const int *p,p的类型是const int*;int * const  p的类型是int *。

New和delete

New和malloc:new不仅可以做内存开辟,还可以做内存初始化操作。Malloc开辟内存失败是通过返回值和nullptr做比较;而new开辟内存失败,是通过抛出bad_alloc类型的异常来做判断,可以通过try_catch语法检测异常。New出来的空间要释放用delete,malloc出来的空间释放要用free。

int *q1 = new int[20];
delete[] q1;
int num = new int(20);
delete q1;
目录
相关文章
|
2天前
|
存储 C++ 索引
C++函数指针详解
【10月更文挑战第3天】本文介绍了C++中的函数指针概念、定义与应用。函数指针是一种指向函数的特殊指针,其类型取决于函数的返回值与参数类型。定义函数指针需指定返回类型和参数列表,如 `int (*funcPtr)(int, int);`。通过赋值函数名给指针,即可调用该函数,支持两种调用格式:`(*funcPtr)(参数)` 和 `funcPtr(参数)`。函数指针还可作为参数传递给其他函数,增强程序灵活性。此外,也可创建函数指针数组,存储多个函数指针。
|
10天前
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
14 3
|
1月前
|
C++
C++(十九)new/delete 重载
本文介绍了C++中`operator new/delete`重载的使用方法,并通过示例代码展示了如何自定义内存分配与释放的行为。重载`new`和`delete`可以实现内存的精细控制,而`new[]`和`delete[]`则用于处理数组的内存管理。不当使用可能导致内存泄漏或错误释放。
|
1月前
|
C++
C++(十八)Smart Pointer 智能指针简介
智能指针是C++中用于管理动态分配内存的一种机制,通过自动释放不再使用的内存来防止内存泄漏。`auto_ptr`是早期的一种实现,但已被`shared_ptr`和`weak_ptr`取代。这些智能指针基于RAII(Resource Acquisition Is Initialization)原则,即资源获取即初始化。RAII确保对象在其生命周期结束时自动释放资源。通过重载`*`和`->`运算符,可以方便地访问和操作智能指针所指向的对象。
|
1月前
|
C++
C++(九)this指针
`this`指针是系统在创建对象时默认生成的,用于指向当前对象,便于使用。其特性包括:指向当前对象,适用于所有成员函数但不适用于初始化列表;作为隐含参数传递,不影响对象大小;类型为`ClassName* const`,指向不可变。`this`的作用在于避免参数与成员变量重名,并支持多重串联调用。例如,在`Stu`类中,通过`this->name`和`this->age`明确区分局部变量与成员变量,同时支持链式调用如`s.growUp().growUp()`。
|
2月前
|
存储 安全 C++
C++:指针引用普通变量适用场景
指针和引用都是C++提供的强大工具,它们在不同的场景下发挥着不可或缺的作用。了解两者的特点及适用场景,可以帮助开发者编写出更加高效、可读性更强的代码。在实际开发中,合理选择使用指针或引用是提高编程技巧的关键。
24 1
|
2月前
|
安全 NoSQL Redis
C++新特性-智能指针
C++新特性-智能指针
|
2月前
|
编译器 C++
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
|
2月前
|
存储 程序员 编译器
c++学习笔记08 内存分区、new和delete的用法
C++内存管理的学习笔记08,介绍了内存分区的概念,包括代码区、全局区、堆区和栈区,以及如何在堆区使用`new`和`delete`进行内存分配和释放。
40 0
|
2月前
|
存储 C++
c++学习笔记06 指针
C++指针的详细学习笔记06,涵盖了指针的定义、使用、内存占用、空指针和野指针的概念,以及指针与数组、函数的关系和使用技巧。
30 0
下一篇
无影云桌面