【C++】基础知识(下)

搭建安装使用CrossOver CrossOver 是一款系统兼容软件,它让您可以在 Mac 和 Linux 系统上运行 Windows 应用/游戏,不必购买 Windows 授权,不必重启,不用虚拟机。通过 CrossOver, 从 dock 直接启动 Windows 应用/游戏,与您的 Mac 和 Linux 系统无缝集成。 阅读详情

一、内联函数

(1). 概念
  以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。
在这里插入图片描述

  如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。
查看方式:

  1. 在release模式下,查看编译器生成的汇编代码中是否存在call Add
  2. 在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化,以下给出vs2013的设置方式)
    在这里插入图片描述
  3. inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜使用作为内联函数。
  4. inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联。
  5. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。
// F.h
#include <iostream>
using namespace std;
inline void f(int i);
// F.cpp
#include "F.h"
void f(int i) {
cout << i << endl; }
// main.cpp
#include "F.h"
int main()
{ f(10);
return 0; }

【面试题】
宏的优缺点?
优点:
1.增强代码的复用性。
2.提高性能。
缺点:
1.不方便调试宏。(因为预编译阶段进行了替换)
2.导致代码可读性差,可维护性差,容易误用。
3.没有类型安全的检查 。
C++有哪些技术替代宏?

  1. 常量定义 换用const
  2. 数定义 换用内联函数

二、auto关键字

这个关键字在上一节关键词中没有,这个是c++11中新定义的关键字
  auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。

int TestAuto()
{
return 10; }
int main()
{
int a = 10;
auto b = a;
auto c = 'a';
auto d = TestAuto();
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
//auto e; 无法通过编译,使用auto定义变量时必须对其进行初始化
return 0; }

【注意】
  使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。

auto使用细则

  1. auto与指针和引用结合起来使用
      用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&
int main()
{
int x = 10;
auto a = &x;
auto* b = &x;
auto& c = x;
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
*a = 20; *b = 30; c = 40;
return 0; }
  1. 在同一行定义多个变量
      当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
void TestAuto()
{
auto a = 1, b = 2; 
auto c = 3, d = 4.0; // 该行代码会编译失败,因为c和d的初始化表达式类型不同
}
  1. auto不能推导的场景
  • auto不能作为函数的参数
void TestAuto(auto a)
{}
  • auto不能直接用来声明数组
void TestAuto()
{
int a[] = {1,2,3};
auto b[] = {4,5,6};
}
  • 为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法
  • auto在实际中最常见的优势用法就是跟以后会讲到的C++11提供的新式for循环,还有lambda表达式等进行配合使用。
  • auto不能定义类的非静态成员变量
  • 实例化模板时不能使用auto作为模板参数

三、基于范围的for循环(c++11)

在C++98中如果要遍历一个数组,可以按照以下方式进行:

void TestFor()
{
int array[] = { 1, 2, 3, 4, 5 };
for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
array[i] *= 2;
for (int* p = array; p < array + sizeof(array)/ sizeof(array[0]); ++p)
cout << *p << endl; }

  对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。

void TestFor()
{
int array[] = { 1, 2, 3, 4, 5 };
for(auto& e : array) e *= 2;
for(auto e : array)
cout << e << " ";
return 0; }

注意:与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环。

范围for的使用条件

  for循环迭代的范围必须是确定的
对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。
注意:以下代码就有问题,因为for的范围不确定

void TestFor(int array[])
{
for(auto& e : array)
cout<< e <<endl; }

迭代的对象要实现++和==的操作。

四、指针空值nullptr(C++11)

  1. C++98中的指针空值
      在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的
    错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化:
void TestPtr()
{
int* p1 = NULL;
int* p2 = 0;
// ……
}

NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:

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

可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如:

void f(int) {
cout<<"f(int)"<<endl; }
void f(int*) {
cout<<"f(int*)"<<endl; }
int main()
{ f(0);
f(NULL);
f((int*)NULL);
return 0; }

   程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成 0,因此与程序的初衷相悖。
  在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0。

  1. nullptr 与 nullptr_t
      为了考虑兼容性,C++11并没有消除常量0的二义性,C++11给出了全新的nullptr表示空值指针。C++11为什么不在NULL的基础上进行扩展,这是因为NULL以前就是一个宏,而且不同的编译器厂商对于NULL的实现可
    能不太相同,而且直接扩展NULL,可能会影响以前旧的程序。因此:为了避免混淆,C++11提供了nullptr,即:nullptr代表一个指针空值常量。nullptr是有类型的,其类型为nullptr_t,仅仅可以被隐式转
    化为指针类型,nullptr_t被定义在头文件中:
typedef decltype(nullptr) nullptr_t;

注意:

  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
  2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
  3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
CPP基础知识 define会多次展开分配内存,const第一次使用的时候就分配内存,后面使用的时候则不需要再次分配内存减少内存的开销。b,这很危险,正确写法:#define MUL(a, b) ((a)nullptr 无法隐式转换为整形,而可以隐式匹配指针类型。const与define定义的变量。p = new int与int。 阅读详情

相关推荐

C++基础知识大全

秋招基本尘埃落定了,打算总结一下C++学习路线的相关知识,今天是第一篇:C++基础知识总结。 面向对象的三大特性: 1、封装:把客观事物抽象为类,包含自己的属性和方法。 2、继承:使用现有类的所有功能,在无需重新编写原有类的情况下对类的功能进行拓展。被继承的类成为父类或基类,继承的类成为子类或派生类。 3、多态:一种形式,多种状态,分为静态多态和动态多态。静态多态指编译时多态,如函数重载、模板;动态多态指运行时多态,特指virtual虚函数机制形成的多态。 类的访问权限:private、protected

weixin_49199646的博客 1万+

Ubuntu下开发环境安装

<br />虽然很简单的几个命令,不过还是记录一下:<br /> <br />一. 安装C/C++程序的开发环境 <br />1. sudo apt-get install build-essential //安装主要编译工具 gcc, g++, make <br />2. sudo apt-get install autoconf automake1.9 <br />3. sudo apt-get install flex bison <br />4. sudo apt-get install manpa

聚沙成塔 983

CPP入门基础知识

1.命名空间 2.C++基本的输入输出流 3.重载(C++为什么支持重载?)  4.C++缺省参数  5.指针和引用(概念、使用方法、做参数、做返回值的作用,指针和引用的区别) ——————————————————————————————————————————————————————————————————— 1.命名空间 http://blog.youkuaiyun.com/passball

NICOC_的博客 1200

crossover的使用过程中出现的问题和解决方法

crossover的使用过程中出现的问题和解决方法: 原因分析: 出现X11丢失的主要是因为缺少的X11软件包,这一错误在Mac OS 10.6系统上发生的频率比较高,在Mac OS 10.8及更高版本中已经解决了解决。 解决方法: 1、安装x11安装包 1)要安装缺少的X11软件包,先要将软件包准备好,可以在网上下载。插入Mac OS 10.6光盘并打开“可选安装”文件夹。 图1:下载软件 2)...

weixin_34303897的博客 2万+

cpp入门基础知识

c++入门

y_willing的博客 870

【从零搭建到实战运行】基于PX4-1.13与XTDrone的FAST-LIVO2 Gazebo仿真全流程解析

本文详细解析了从零开始搭建基于PX4-1.13飞控、XTDrone仿真框架与Gazebo的FAST-LIVO2无人机仿真平台的全流程。内容涵盖环境配置、Livox雷达插件定制、算法部署与参数调试,旨在帮助开发者快速构建完整的激光-惯性-视觉SLAM仿真环境,并解决集成过程中的常见问题。

weixin_29218509的博客 520

初识Cpp之 一、基础知识

​ C++融合了三种不同的编程方式:1、C语言代表的过程性语言,2、C++在C语言的基础上添加的类代表的面向对象语言,3、C++模板支持的泛型编程。使用C++的原因之一是为了利用其面向对象的特性。要利用这种特性,必须对标准C语言知识有较为深入的了解,因为它提供了基本类型、运算符、控制结构和语法规则。​ 面向对象编程(Object Oriented Programming, OOP)的诞生,试图让语言来满足问题的要求,其理念是设计与问题本质特性相对应的数据格式。

Shen Mu Xin's Blog 2989

Python自动化神器:5分钟搞定PSCAD仿真波形图导出到Word(附WPS兼容方案)

本文介绍如何利用Python自动化库快速将PSCAD仿真波形图导出到Word或WPS,大幅提升电力系统仿真工程师的工作效率。通过精准坐标定位、智能排版和批量处理功能,实现仿真报告的自动化生成,同时提供WPS兼容方案,适用于不同办公环境。

sony5的博客 207

【C++】Cpp入门基础知识

Cpp入门基础知识  一,命名空间     首先应该明白数据在内存中的存储位置,如下图所示;  理解域为一个代码框,一个变量的作用域为一个代码框,在主函数外定义的无框变量的作用域是全局即整个程序。 在任何一个域中都可以使用全局变量,所以应尽量减少使用全局变量,会让程序不稳定。 在不同的域可以重名定义变量,如下面的变量a,输出时使用该域中的变量。 namespace定义一个域,u

LazyFish的博客 1035

17|CI/CD 集成与质量门禁:让精准测试进入发布流水线

本文讲解精准测试如何接入 CI/CD 流水线,并通过质量门禁辅助发布决策。测试开发工程师。Java 后端开发工程师。质量平台 / DevOps 平台建设者。想了解精准测试落地方法的技术负责人。

专注 AI 精准测试平台实战落地,分享从代码 Diff 到回归决策的完整工程闭环。主张“先建数据链路,再上 AI 智能”,让测试从“靠经验”走向“基于风险”。 66

阿里云百炼全解析:一站式大模型开发平台的架构与行业实践

摘要: 阿里云百炼平台通过一站式架构革新大模型开发范式,将传统碎片化工具链整合为统一工作流,实现开发周期从月级到小时级的跃迁。其核心架构包含接入层、引擎层与资源层,关键技术突破包括MCP服务协议、多模态引擎及高性能训练优化。平台提供全生命周期开发支持,从数据准备到模型部署,并通过VPC隔离、数据加密构建企业级安全体系。已在医疗、电力等行业实现显著增效,如阿斯利康药物分析系统准确率提升至95%。未来将向多Agent协同、边缘计算等方向演进,推动AI技术深度融入产业核心。

fudaihb的博客 1990

cpp基础知识

语言:C++ 变量和基本类型 基本内置类型 算数类型 算数类型就是我们平常使用的int, double, char, long等等,这里需要注意的是在平时的编程中应该如何正确选择适当的类型。 如何选择适当的类型 当明确知晓数值不可能为负数的时候,选择无符号类型 使用int执行整数运算,如果超出int的范围,则使用long long 执行浮点数运算选用double,一般不选用其他的浮点数类型 类型转换 当一个算术表达式中既有无符号数又有int值时,int值就会转换为无符号数 当从无符号.

m0_52363848的博客 611

Qt Installer Framework 简单使用

qt installer framework 简单使用

qq_42815643的博客 2576

cpp八股【第三期】cpp基础知识

cpp基础知识八股

m0_55983046的博客 895

架构师成长之路(1)--什么是架构师

前言: 哲学家常思考的问题:" 我是谁?"" 我从哪里来?"" 要到哪里去?不只是哲学家,我想每个人都有自己对这三个问题的认知。 如果我们要成为架构师,我们自己要面临的三大问题: 找准自己定位:我是谁?在哪里? 怎样做好架构师:我要做什么? 如何搭建架构师知识体系:我该怎么做? 这里面就是做事方法论:目标(我要做什么),方法(计划)(我该怎么做), 执行/行动找准自己定位:我是谁?在哪里...

黄规速博客:学如逆水行舟,不进则退 6万+

使用Python从图像中提取表格

python 实现图片表格提取

qq_30895747的博客 2570

[C++]C++基础知识概述

C++基础知识概述

qq_66767938的博客 1364

宇瞳杯视讯镜头完成版(除公差/鬼像分析)

宇瞳杯视讯镜头完成版(除公差/鬼像分析)

weixin_72050316的博客 1049

C++基础知识全面总结

需要原图的老铁,留下邮箱。

mysterious superstar 341

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

cpp笔记01-基础知识

这里写自定义目录标题命名空间 namespace字面量 literals变量 variables运算符 operators枚举类型 enumerated types结构体 structs条件语句 conditional statements条件运算符 conditional operators逻辑运算符 logical evaluation operators三向比较符 three-way comparisons函数 functions属性 attributesc数组 c-style arraysstd:

u013870511的博客 404

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【C++】基础知识

C++基础知识笔记

IdealSanX的博客 419

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C++入门基础知识总结(2022整理)

一、C++入门基础知识之什么是C++? 1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。 PDF版、C++资料教程、C++电子书籍获取 关注微信公众号:“ C和C加加 ” 回复关键字:“ C++ ”即可领取 二、C++入门基础..

weixin_55305220的博客 2万+

C++——基础知识1

c++文件扩展名,cout,cin,\a,\b,c++基础

weixin_43920383的博客 271

C++基础知识

基础语法部分 external的使用 extern:声明使得变量为程序所知 顶层const和底层const 构造函数和析构函数 继承和多态

lxc689的博客 2437
上一篇: 【C++】基础知识(上)
下一篇: 【C++】类与对象(上)
信手斩龙
博客等级 码龄8年 13粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值