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

相关文章

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

C++打印 vector的几种方法小结

《C++打印vector的几种方法小结》本文介绍了C++中遍历vector的几种方法,包括使用迭代器、auto关键字、typedef、计数器以及C++11引入的范围基础循环,具有一定的参考价值,感兴... 目录1. 使用迭代器2. 使用 auto (C++11) / typedef / type alias

C++ scoped_ptr 和 unique_ptr对比分析

《C++scoped_ptr和unique_ptr对比分析》本文介绍了C++中的`scoped_ptr`和`unique_ptr`,详细比较了它们的特性、使用场景以及现代C++推荐的使用`uni... 目录1. scoped_ptr基本特性主要特点2. unique_ptr基本用法3. 主要区别对比4. u

C++11中的包装器实战案例

《C++11中的包装器实战案例》本文给大家介绍C++11中的包装器实战案例,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录引言1.std::function1.1.什么是std::function1.2.核心用法1.2.1.包装普通函数1.2.

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

JAVA SpringBoot集成Jasypt进行加密、解密的详细过程

《JAVASpringBoot集成Jasypt进行加密、解密的详细过程》文章详细介绍了如何在SpringBoot项目中集成Jasypt进行加密和解密,包括Jasypt简介、如何添加依赖、配置加密密钥... 目录Java (SpringBoot) 集成 Jasypt 进行加密、解密 - 详细教程一、Jasyp

Java通过ServerSocket与Socket实现通信过程

《Java通过ServerSocket与Socket实现通信过程》本文介绍了Java中的ServerSocket和Socket类,详细讲解了它们的构造方法和使用场景,并通过一个简单的通信示例展示了如何... 目录1 ServerSocket2 Socket3 服务器端4 客户端5 运行结果6 设置超时总结1