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获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤