C++入门:从C语言到C++的过渡(3)

2024-05-26 05:20
文章标签 语言 c++ 入门 过渡

本文主要是介绍C++入门:从C语言到C++的过渡(3),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.内联函数

1.1内联函数的定义

1.2特性

2.auto关键字

2.1auto的简介

2.2注意事项

3.范围for

4.nullptr空指针

1.内联函数

在C语言中,无论使用宏常量还是宏函数都容易出错,而且无法调试。而C++为了弥补这一缺陷,引入了内联函数的概念替代宏函数。

1.1内联函数的定义

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

1.2特性

1.inline是一种以空间换时间的做法,如果编译器将函数当作内联函数处理,在编译阶段,会用函数体替代函数调用。但会让目标文件变大

2.inline对于编译器而言只是一个建议,不同的编译器对于inline的实现机制可能不同,一般的编译器会将函数规模较小而且不是递归不会频繁调用的函数会采用inline修饰,否则将会忽视inline特性。

3.因为内联函数会在调用时直接展开,如果声明与定义分离内联函数的地址根本不会进入符号表,链接时就无法找到定义的函数,就会发生链接错误。

2.auto关键字

2.1auto的简介

在C++中,随着程序越来越复杂,程序所用的类型也越来越复杂。为了简化代码,增加代码的可读性,C++11引入了自动类型推断auto。在C语言中,auto修饰的变量,是具有自动存储器的局部变量。但是实用性很小,所以C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。

2.2注意事项

1.用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型必须加&

int x = 1;
//auto是指针
auto a = &x;
auto* b = &x;
//auto是引用
auto& c = x;

2.当用auto在同一行声明中定义多个变量时,这些变量必须是相同的类型,否则将会报错。 

auto a = 1, b = 2;//正确
auto c = 1, d = 1.11;//error

 3.auto不能作为函数的参数或者用来直接声明数组。

3.范围for

for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。

#include<iostream>
using namespace std;
int main()
{int arr[] = { 1,2,3,4,5 };//取数组arr的值依次赋值给efor (auto e : arr){cout << e << endl;}return 0;
}

如果我们要改变数组的值的话,我们可以使用引用。

#include<iostream>
using namespace std;
int main()
{int arr[] = { 1,2,3,4,5 };//给数组中每个数*2for (auto&e : arr){e *= 2;}return 0;
}
  • 基于auto的范围for循环也可以使用continue和break关键字。 

4.nullptr空指针

在C语言中,我们定义了一个宏NULL,我们可以在C的头文件(stddef.h)中看到如下代码:

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

通过上述代码我们可以知道,NULL既可以是0,又可以是一个空指针。因此我们在使用时就可能会出现一些问题。

我们本想传入NULL来调用传入指针的f函数,但却调用了第一个函数,因此在这个地方出现了歧义。 这是因为在C++98标准中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将0看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void*)0。因此,在C++11中,加入了一个新关键字nullptr表示空。

以下是使用nullptr的两个注意点

1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入

2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。

 

这篇关于C++入门:从C语言到C++的过渡(3)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

Java List 使用举例(从入门到精通)

《JavaList使用举例(从入门到精通)》本文系统讲解JavaList,涵盖基础概念、核心特性、常用实现(如ArrayList、LinkedList)及性能对比,介绍创建、操作、遍历方法,结合实... 目录一、List 基础概念1.1 什么是 List?1.2 List 的核心特性1.3 List 家族成

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路