快速熟悉C++之常用语法

news2025/3/12 23:47:53

函数重载(Overload)

规则

函数名相同
参数个数不同、参数类型不同、参数顺序不同

注意

返回值类型与函数重载无关
调用函数时,实参的隐式类型转换可能会产生二义性

本质

采用了name mangling或者叫name decoration技术
C++编译器默认会对符号名(比如函数名)进行改编、修饰,有些地方翻译为“命名倾轧”
重载时会生成多个不同的函数名,不同编译器(MSVC、g++)有不同的生成规则
通过IDA打开【VS_Release_禁止优化】可以看到

原理

C++代码

解析代码

默认参数

规则

C++允许函数设置默认参数,在调用时可以根据情况省略实参。规则如下:
默认参数只能按照右到左的顺序
如果函数同时有声明、实现,默认参数只能放在函数声明中
默认参数的值可以是常量、全局符号(全局变量、函数名)
如果函数的实参经常是同一个值, 可以考虑使用默认参数
函数重载、默认参数可能会产生冲突、二义性(建议优先选择使用默认参数)

原理:

C++代码

汇编代码:

 备注:E8是call的指令,E8后面的一串是根据下一条指令算出来的,具体参见intel的汇编指令白皮书。

extern “C”

规则

extern "C" 修饰的代码会按照C语言的方式去编译

 如果函数同时有声明和实现,要让函数声明被extern "C"修饰,函数实现可以不修饰

 

 有时也会在编写C语言代码中直接使用extern “C” ,这样就可以直接被C++调用

 通过使用宏__cplusplus来区分C、C++环境

#pragma once

我们经常使用 #ifndef #define #endif 来防止头文件的内容被重复包含
#pragma once 可以防止整个文件的内容被重复包含
区别
#ifndef #define #endif 受C\C++标准的支持,不受编译器的任何限制
有些编译器不支持 #pragma once (较老编译器不支持,如GCC 3.4版本之前),兼容性不够好
#ifndef #define #endif 可以针对一个文件中的部分代码,而 #pragma once 只能针对整个文件

 内联函数(inline function)

规则

使用 inline 修饰函数的声明或者实现,可以使其变成内联函数
建议声明和实现都增加 inline 修饰
特点
编译器会将函数调用直接展开为函数体代码
可以减少函数调用的开销
会增大代码体积
注意
尽量不要内联超过10行代码的函数
有些函数即使声明为 inline ,也不一定会被编译器内联,比如递归函数

debubg下不会内联,只有release下优化才会出现内联

VS窥探内联的本质

内联函数与宏

内联函数和宏,都可以减少函数调用的开销
对比宏,内联函数多了语法检测和函数特性
思考以下代码的区别
#define sum (x) (x + x)
inline int sum( int x ) { return x + x ; }
int a = 10; sum(a++);

const

const 是常量的意思,被其修饰的变量不可修改
如果修饰的是类、结构体(的指针),其成员也不可以更改
以下5个指针分别是什么含义?

 int 和const是可以替换的,两者位置互换效果一致!

上面的指针问题可以用以下结论来解决:
const 修饰的是其右边的内容
解释如下:

 demo如下:

引用(Reference)

规则

在C语言中,使用指针(Pointer)可以间接获取、修改某个变量的值
在C++中,使用引用(Reference)可以起到跟指针类似的功能
注意点
引用相当于是变量的别名(基本数据类型、枚举、结构体、类、指针、数组等,都可以有引用)
对引用做计算,就是对引用所指向的变量做计算
在定义的时候就必须初始化,一旦指向了某个变量,就不可以再改变,“从一而终”
可以利用引用初始化另一个引用,相当于某个变量的多个别名
不存在【引用的引用、指向引用的指针、引用数组】
引用存在的价值之一:比指针更安全、函数返回值可以被赋值

引用的本质

引用的本质就是指针,只是编译器削弱了它的功能,所以引用就是弱化了的指针
指令代码一模一样

一个引用占用一个指针的大小

 

常引用(Const Reference)

引用可以被 const 修饰,这样就无法通过引用修改数据了,可以称为常引用
const 必须写在&符号的左边,才能算是常引用
const 引用的特点
可以指向临时数据(常量、表达式、函数返回值等)
可以指向不同类型的数据
作为函数参数时( 此规则也适用于 const 指针
可以接受 const 和非 const 实参(非 const 引用,只能接受非 const 实参)
可以跟非 const 引用构成重载
当常引用指向了不同类型的数据时,会产生临时变量,即引用指向的并不是初始化时的那个变量

数组的引用

常见的2种写法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/20013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java锁对象

Java锁 1. 对象头 1.1 简介 以32位的 JVM 为例,每个Java对象的对象头都包含了如下信息 # 组成 Mark Word: 锁的信息,hashcode,垃圾回收器标志 Klass Word: 指针,包含当前对象的Class对象的地址,类对象来确…

基于python的校园社团管理系统的设计与实现

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&…

JS 类总结

类 class 关键字是 ES6 新增的。类(class)是ECMAScript 中新的基础性语法糖,本质上还是一个函数,但实际上它使用的仍然是原型和构造函数的概念。并且类受块级作用域限制。 class Person { } console.log(Person);// class Perso…

Java无锁并发

共享资源 1. 不安全场景 package com.nike.erick.d05;import lombok.Getter;import java.util.concurrent.TimeUnit;public class Demo01 {public static void main(String[] args) throws InterruptedException {BankService bankService new BankService();for (int i 0;…

H5 app开启web调试

前言: 在Android app逆向时,H5类型的app的加密通常在js中,所以就需要一种手段来查看源代码,查看加密过程。 0、如何确认h5 app 以狗东为例: 随便选择一个元素,可以看到是控件下的一个类 通过与H5类型的ap…

[附源码]SSM计算机毕业设计在线课程网站JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

基于java_ssm_vue鲜花在线销售商城网站-计算机毕业设计

现在,许多人都喜欢在节日的时候给家人或朋友送鲜花,但是有时候会因为工作忙而忘记或者是没有时间自己去买,同时也有些人觉得自己去买有些麻烦,所以鲜花网络销售是很有必要的。这个网站应该可以提供提前预定、送货上门等服务。首先…

Arduino开发实例-MAX30100传感器模块连接问题解决

MAX30100传感器模块连接问题解决 MAX30100 是一款集成脉搏血氧饱和度和心率监测传感器解决方案。 它结合了两个 LED、一个光电探测器、优化的光学器件和低噪声模拟信号处理,以检测脉搏血氧饱和度和心率信号。 MAX30100 采用 1.8V 和 3.3V 电源供电,可通过软件关断,待机电流…

【Java第33期】:在普通的Maven项目中存储Bean对象并获取和使用

作者:有只小猪飞走啦 博客地址:https://blog.csdn.net/m0_62262008?typeblog 内容:存储Bean对象,再在Spring中获取Bean对象,对其进行使用。 文章目录前言一,存储Bean对象1,创建Bean对象2&…

过控Matlab-串级控制系统的参数整定(二)

太原理工大学过程控制实验之串级控制系统的参数整定 过控Matlab-串级控制系统的参数整定实验内容1.根据动态特性参数法对简单控制系统的控制器参数整定2.根据稳定边界方法对简单控制系统的控制器参数整定利用稳定边界法,分别计算系统采用P、PI、PID调节规律时的PID控…

玩机搞机---关于安卓机型工厂固件 刷机 端口解密 解bl锁 写串 nv损坏 等相关常识

*******工程机和工厂固件方面的常识 可能很多玩机友友对什么是工厂固件比较陌生。那么今天的话题就围绕这个和大家讨论下。其实一般厂家的流程都是在一部机型推放市场之前,需要经过预研企划、研发设计、全面测试等诸多环节。在这一整个改善的全过程中,厂…

使用Eclipse搭建STM32嵌入式开发环境

1. Eclipse 软件和相关工具的安装 使用 Eclipse 开发 STM32 等嵌入式软件项目时,需要安装的软件或者工具有: Eclipse 软件本身,eclipse-inst-jre-win64.exe交叉编译工具链,gcc-arm-none-eabi-10.3-2021.10-win32make 构建工具&a…

linux读写锁

这里写目录标题读写锁的认识读写锁的相关函数练习读写锁的认识 (1)读写锁是一把锁 (2)读写锁的类型: pthread_rwlock_t lock 又分“读锁”(对内存进行读操作)和“写锁”(对内存进行…

【数据结构Note5】- 树和二叉树(知识点超细大全-涵盖常见算法 排序二叉树 线索二叉树 平衡二叉树 哈夫曼树)

文章目录5.1 树和二叉树引入5.1.1 树的概念5.1.2 树的表示5.1.3 树中基本术语5.1.4 树的表示5.2 二叉树5.2.1 概念5.2.2 二叉树的性质5.2.3 特殊的二叉树5.2.4 二叉树的顺序存储5.2.5 二叉树的链式存储5.2.6 二叉树的深度优先遍历(递归)5.2.7 二叉树的遍…

[MQ] 死信队列介绍与场景描述

✨✨个人主页:沫洺的主页 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专…

Js逆向教程-11常见混淆AA和JJ

Js逆向教程-11常见混淆AA和JJ js默认 支持Unicode的。 所以支持所有的国家语种。 有没有哪些国家的和O很像但不是O,和0很像但不是0,和p很像但不是p 所以可以用这个相近的符号进行代码混淆。 var O00OO,o00oo;一、AA混淆和OO混淆 https://www.sojson.com/aaencode.html 这个…

Docker guide

前言 docker学习记录&#xff0c;内容参考 Docker Training Course for the Absolute Beginner Basic Command docker pull <Image:只是下载image&#xff0c;不会运行docker run <Image>:启动image实例&#xff0c;如果image不在docker host上&#xff0c;docker会…

【长难句分析精讲】状语从句

1. 状语从句九大类 时间状语从句&#xff1a;after / before / when / while / as / since / once / until地点状语从句&#xff1a;where原因状语从句&#xff1a;because / as / for / since让步状语从句&#xff1a;though / although / even if even though / while / as…

[Spring Cloud] Eureka Server安装

✨✨个人主页:沫洺的主页 &#x1f4da;&#x1f4da;系列专栏: &#x1f4d6; JavaWeb专栏&#x1f4d6; JavaSE专栏 &#x1f4d6; Java基础专栏&#x1f4d6;vue3专栏 &#x1f4d6;MyBatis专栏&#x1f4d6;Spring专栏&#x1f4d6;SpringMVC专栏&#x1f4d6;SpringBoot专…

ARM仿真器J-Link灯不亮的解决办法

感慨&#xff1a; 网络世界真是越来越封闭了啊&#xff0c;下载东西越来越难。 解决问题会越来越难。 解决仿真器Jlink灯不亮这个问题用了一下午..... 步骤&#xff1a; &#xff08;弯路&#xff1a;windows安装AT91-ISP&#xff0c;发现SAM_PROG v2.4加载bin后不能点击Write…