C++学习过程中的一些值得注意的小点(1)

2023-10-21 18:30

本文主要是介绍C++学习过程中的一些值得注意的小点(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、内联函数

1.1内联函数的定义

inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。

call指令表明Add函数在被调用的时候建立了栈帧。如果在上述函数前增加inline关键字将其改为内联函数,在编译期间编译器会用函数体替换函数的调用。

1.2内联函数的特性

1.2.1优点

咋一看,内联函数与宏定义的作用好像很相似,他们的功能确实相似,但是内联函数克服了宏定义的一些缺点。首先,内联函数克服了宏定义不可调试的缺点,内联函数可以通过调试进到函数体的内部观察函数体中代码的逻辑运行。再一个,内联函数函数体内的写法跟一般函数没有任何区别,因此,内联函数克服了宏定义代码可读性差、维护性差、没有安全类型检查等等缺点。加上内联函数少了栈帧的开销,一定程度上提高了程序的运行效率。

1.2.2缺点

inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段会用函数体替换函数调用,但这种做法的缺陷就是可能会使目标文件变大,导致文件在网络传输的过程中传输速度变慢,(有一个例子就是用户在下载软件的时候文件会很大,导致下载时间很长)导致用户体验降低,这是很不利的影响。

1.2.3使用方式说明

鉴于内联函数的缺点,因此类中的函数在定义的时候短小的函数(一般不超过十行)可以考虑定义为内联函数,代码量大的函数就不要定义成内联函数了。但我们其实也不必担心,因为现在的编译器已经十分的“聪明”了。lnline说明只是向编译器发出的一个请求,是否将函数定义为内联函数还是取决于编译器自己的判断。

需要着重注意的是:内联函数不要声明和定义分离,分离会导致链接错误。因为inline被展开就没有函数地址了,链接就会找不到。

二、类和对象中值得注意的一些小点

1.在C++中,类型就是类名,在定义变量时变量名前不需要加struct

2.struct默认访问限定符为public,class默认访问限定符为private。

3.默认直接在类中定义的函数就是inline(但实际上取决于编译器)。

正确的用法:短小的函数直接在类中定义,长的函数声明和定义分离。

4.C++中实例出来的对象的大小只需要考虑成员变量的大小和内存对齐,成员函数属于类,成员函数的地址存储在公共代码区。

从上面的代码可以看到,类实例化出来的对象大小只包含了成员变量的大小,当然也会涉及内存对齐 (内存对齐在前面的博客中已有详细介绍),不包含成员函数的大小。

5.无成员变量的类,对象大小开一个字节,不存储有效数据,用来标识这个对象存在过

6.成员函数的参数会隐式的多一个类类型的this指针,this指针指向创建出来的对象的首地址。

this指针本质是一个形参,存在栈区上。不能够显式地传this指针,否则会报编译错误。

7.默认构造函数注意点:内置数据类型不处理(int,double......),自定义类型会去调用它的默认构造函数,如果自定义类型没有默认构造函数,会报编译错误。

一般情况下,我们都要自己写构造函数

成员都是自定义类型,或者声明时给了缺省值,可以考虑让编译器自己生成构造函数

8.默认析构函数

默认生成的析构函数,行为跟构造类似

内置类型成员不做处理,自定义类型成员会去调用它的析构函数

这篇关于C++学习过程中的一些值得注意的小点(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/256183

相关文章

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

java内存泄漏排查过程及解决

《java内存泄漏排查过程及解决》公司某服务内存持续增长,疑似内存泄漏,未触发OOM,排查方法包括检查JVM配置、分析GC执行状态、导出堆内存快照并用IDEAProfiler工具定位大对象及代码... 目录内存泄漏内存问题排查1.查看JVM内存配置2.分析gc是否正常执行3.导出 dump 各种工具分析4.