【高级程序设计语言C++】 C++基础知识

news2024/12/23 10:53:36

  • 1.1 C++关键字
  • 1.2 命名空间
    • 1.2.1命名空间定义
    • 1.2.2命名空间的使用
  • 1.3缺省参数
    • 1.3.1缺省参数分类
  • 1.4函数的重载
  • 1.5.引用
    • 1.5.1引用的用法
      • 1.引用做参数
      • 2.引用返回
    • 1.5.2 常引用
  • 1.6 传值和传引用的区别
  • 1.7 引用和指针的区别
  • 1.8 auto关键字
    • auto的使用细则

1.1 C++关键字

C++的关键字共有63个,而C语言有32个关键字。

C++关键字如下图:

img

1.2 命名空间

C++存在着大量的变量,函数以及后续所要学习的类,稍不注意,在取名字的时候就会重复,因此C++有一种方法可以为这些变量,函数以及类建起围墙。避免了命名冲突或者名字污染。

1.2.1命名空间定义

定义命名空间,需要用到namespace关键字,后面则是根据要求写自己想要的命名空间的名字,然后接上 {} 即可,** {} 中即是命名空间的成员。

施展武功如下:

namespace my_test
{
// 命名空间中可以定义变量/函数/类型
	int rand = 10;
	int Add(int left, int right)
	{
    	return left + right;
	}
	struct Node
	{
		struct Node* next;
		int val;
	};
}
//2. 命名空间可以嵌套
// test.cpp
namespace N1
{
int a;
int b;
int Add(int left, int right)
 {
     return left + right;
 }
namespace N2
 {
     int c;
     int d;
     int Sub(int left, int right)
     {
         return left - right;
     }
 }
}
//3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
// ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个
// test.h
namespace N1
{
int Mul(int left, int right)
 {
     return left * right;
 }
}

1.2.2命名空间的使用

1.加命名空间名称及作用域限定符

#include <iostream>
namespace N {
	int a = 1;
	int b = 2;
}
int main() {
	printf("%d", N::a);
	return 0;
}

武功施展结果:

img

2.使用using将命名空间中某个成员引入

#include <iostream>
namespace N {
	int a = 1;
	int b = 2;
}
using N::b;
int main() {
	printf("%d\n", b);
	return 0;
}

武功施展如下图:

img

3.使用using namespace命名空间名称引入

#include <iostream>
namespace N {
	int a = 1;
	int b = 2;
}
using namespace N;
int main() {
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

武功施展如下图:

img

1.3缺省参数

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实 参则采用该形参的缺省值,否则使用指定的实参。

施法图:

#include <iostream>
using namespace std;
void func(int a = 0) {
	cout << a << endl;
}
int main() {
	func();
	func(100);
	return 0;
}

施法效果:

img

在没有传参的时候,会使用参数的默认值。如果传参了,就会使用指定的实参。

1.3.1缺省参数分类

1.全缺省参数

void func(int a = 0,int b = 1,int c = 2) {
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}

2.半缺省参数

void Func(int a, int b = 10, int c = 20)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }

施展该武功需要注意以下几点:

1.半缺省参数必须从右往左以此来给出,不能断开给。
不能像这样:

void func(int a = 0,int b,int c = 2) {
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}

中间的b是必须要给赋值的,不然你只能从a开始不给参数

  1. 缺省参数不能在函数声明和定义中同时出现

  2. 缺省值必须是常量或者全局变量

  3. C语言不支持(编译器不支持)

1.4函数的重载

在C++中,函数是支持重载的。什么是重载呢?

重载的意思就是函数名相同,但是参数的个数、类型不同。

例如:

void func() {
	cout << "func()" << endl;
	cout << endl;
}

void func(int x) {
	cout << "func(int x)" << endl;
	cout << endl;
}

void func(int x, int y) {
	cout << "func(int x, int y)" << endl;
	cout << endl;
}

void func(double x) {
	cout << "func(double x)" << endl;
	cout << endl;
}
int main()
{
	func();
	func(1);
	func(1, 2);
	func(1.0);
	return 0;
}

运行结果:

img

函数的返回类型并不是构成重载的原因。

img

在代码生成的时候就已经报错了,倘若编译器不够严格,继续写下去。

img

就会出现二义性的情况,你元素的类型不知道接收哪个函数的返回值,造成了二义性。

1.5.引用

引用是C++的特性,用简短的一句话概括就是引用就是该变量的别名。

别名在生活中很常见,例如水浒传中的108好汉个个都有别名。

例如:及时雨 - 宋江,黑旋风 - 李逵,…

同样的在C++中也是如此

int main() {
	int a = 0;
	int& b = a;
	return 0;
}

这里的b就是a的别名,他们之间的关系如图所示

img

一个变量可以有多个别名,就像生活中的一个人也可以有多个别名,例如狗剩,二蛋,…

同时别名也可以有别名。

int main() {
	int a = 0;
	int& b = a;
	int& c = a;
	int& d = b;
	return 0;
}

通过修改其中一个,也会对a造成改动。

int main() {
	int a = 0;
	int& b = a;
	int& c = a;
	int& d = b;

	b++;
	cout << a << endl;
	c++;
	cout << a << endl;
	d++;
	cout << a << endl;
	return 0;
}

运行结果:

img

注意:

  1. 引用在定义时必须初始化
  2. 一个变量可以有多个引用
  3. 引用一旦引用一个实体,再不能引用其他实体

1.5.1引用的用法

1.引用做参数

引用做参数,一半都是用作输出型参数。

例如简单的交换函数:

void Swap(int& a, int& b) {
	int tmp = a;
	a = b;
	b = tmp;
}

修改了形参,实参也修改了。

2.引用返回

在有些情况,你会遇到要返回两个值的情况,在C语言中可以用指针解决,而在C++中可以用引用解决。

用引用返回可以减少拷贝,提高效率。

1.5.2 常引用

常量也有引用,但是常量的引用只能用常量引用接收。

void TestConstRef() {
    const int a = 10;
    //int& ra = a; // 该语句编译时会出错,a为常量
    const int& ra = a;
    // int& b = 10; // 该语句编译时会出错,b为常量
    const int& b = 10;
    double d = 12.34;
    //int& rd = d; // 该语句编译时会出错,类型不同
    const int& rd = d;
}

1.6 传值和传引用的区别

传值和传引用的区别主要是在效率方面。

以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直

接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效

率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。

所以一般建议用传引用作为传参和返回值

1.7 引用和指针的区别

施展本门功法的引用和指针时,可以看出施展的效果差不多,但是手法(底层)确实不同的。在创建两种武功(语法概念)时,引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。而指针是有着自己的空间的。但是从实际的底层看,引用也是有空间的,因为引用是按照指针方式创建武功的

二者不同点如下:

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
  2. 引用在定义时必须初始化,指针没有要求
  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何

​ 一个同类型实体

  1. 没有NULL引用,但有NULL指针
  2. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32

位平台下占4个字节)

  1. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  2. 有多级指针,但是没有多级引用
  3. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  4. 引用比指针使用起来相对更安全

1.8 auto关键字

本门功法中有一种关键字叫做auto。其作用是自动推导类型。

使用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 Test()
{
	auto a = 1, b = 2;
	auto c = 3, d = 4.0; // 该行代码会编译失败,因为c和d的初始化表达式类型不同
}
  1. auto不能作为函数的参数
//这里代码编译失败,原因是auto不能用作形参类型,因此编译器无法推导a的实际类型
void func(auto a) {
    
}
  1. auto不能直接用来声明数组

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

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

相关文章

vgg16-pytorch

基于pytorch实现VGG16模型 刚听完土哥的入门pytorch&#xff0c;试着写一个不完善的vgg16 VGG16具体的架构: VGG16模型构建&#xff1a; 卷积池化后尺寸计算公式&#xff1a; 引入库&#xff1a; from torch import nn from torch.nn.modules.flatten import Flattendil…

初识stm32

1、什么是单片机&#xff1f; 单片机&#xff08;Single-Chip Microcomputer&#xff09;是一种集成电路芯片&#xff0c;把具有数据处理能力的中央处 理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功 能&#xff08;可能还包括显示驱动电路、…

WHERE条件和ON条件的区别

目录 总结&#xff1a; 1.inner join方式关联 2.left join方式关联 实例 1.建表 2.left join 主表的on和where条件 3.left join 关联表的on和where条件 总结&#xff1a; 1.inner join方式关联 on条件&#xff08;无论是对主表字段的限制还是对关联表字段的限制&#…

9种流程优化方法,提升业务效率!

编者按&#xff1a;简化工作流程、不断发现工作流程中的错误并有效整合、提高内部团队成员和客户的满意度&#xff0c;是当今每个企业、每个管理者乃至每个员工的共同责任。流程优化是永无止境的。本文回顾了流程优化的概念&#xff0c;详述了流程优化给业务带来的好处以及 9 种…

期货交易策略与技术分析经验总结

期货交易是一种金融衍生品&#xff0c;它是指在未来某个特定的时间和地点&#xff0c;按照事先约定的价格和数量&#xff0c;买卖某种标的物的合约。期货交易具有高杠杆、高风险、高收益的特点&#xff0c;因此需要有一定的交易策略和操作技巧&#xff0c;才能在市场中取得成功…

Qt中的信号与槽(Signals and Slots)

Qt中的信号与槽&#xff08;Signals and Slots&#xff09;是一种用于对象间通信的机制&#xff0c;常用于处理用户界面事件和数据更新等情况。通过信号与槽&#xff0c;可以实现对象之间的解耦和灵活的交互。 信号&#xff08;Signal&#xff09;是对象发出的事件或通知&…

肥肠恐布--探索Kali Linux中的Metasploit Framework(MSF听说肾透大佬经常用)

请注意&#xff0c;在使用Metasploit Framework进行渗透测试和漏洞利用时&#xff0c;务必遵守合法和授权的原则&#xff0c;此文仅供大家学习参考&#xff0c;请确保您获得了适当的授权&#xff0c;并遵守法律和合规性要求。非法使用和滥用导致严重的法律后果自负。 目录 前言…

mac使用conda(anaconda和miniconda一样)安装新版本的torch

使用pytorch给的命令行下载会很慢&#xff0c;因此我们应该修改镜像源&#xff0c;然后再下载torch 1.添加镜像 在终端输入以下命令&#xff0c;添加镜像&#xff1a; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ conda conf…

【HMS Core】Health Kit 睡眠各统计类型怎么定义的?有什么区别?

【问题描述】 1、睡眠各统计类型怎么定义的&#xff1f;有什么区别&#xff1f; 2、睡眠状态有5种&#xff0c;各个状态的详细定义是什么&#xff1f; 【解决方案】 1、①科学睡眠&#xff0c;会对睡眠数据进行分析&#xff0c;计算得分等&#xff0c;在连接穿戴设备的前提下…

【AGC】性能管理服务报502问题

【关键字】 AGC、性能管理、502 【问题描述】 有开发者反馈在使用AGC性能管理服务报502错误&#xff0c;接入了analytic sdk 是正常的上报分析数据&#xff0c;但尝试接入apms时出现无法上报情况。 日志截图如下&#xff0c;可以看到分析服务是正常的200上报了数据&#xff…

【Python爬虫与数据分析】Jupyter的安装与快捷键

目录 一、jupyter notebook安装与配置 二、命令模式快捷键 三、编辑模式快捷键 四、文件操作 一、jupyter notebook安装与配置 安装&#xff1a;Jupyter Notebook是以网页的形式打开的一个程序&#xff0c;集成在Anaconda包里面&#xff0c;也可以直接安装python3解释器&a…

jenkins手把手教你从入门到放弃02-jenkins在Windows系统安装与配置(详解)

简介 上一篇对jenkins有了大致了解之后&#xff0c;那么我们就开始来安装一下jenkins。 Jenkins安装 一、安装Java环境   1、你需要做的第一件事情就是在你的机器上安装Java环境。Jenkins是一个基于Java的Web应用程序&#xff0c;所以你至少需要安装JRE。如果没有安装自行百…

Stable Diffusion - Prompts 提示词工程框架

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131544508 当前 Stable Diffusion 模型使用基础的 stable-diffusion-v1-5&#xff0c;即 v1-5-pruned-emaonly.safetensors。 Stable Diffusion …

全网首发,Python解决某象滑动还原验证码100%还原

与一般的滑动验证码不同,某象的滑动还原验证码是将图像上下两块分割,然后在随机一块往右移动,将两块拼图移动成完整的图像才算成功,事实上,解决这类验证码比普通的验证码还要简单 数据集: 我随机采集了某象任意张数据集,将其标注好,top和down代表的是原图中上面还是下面…

怎么把pytorch从CPU版本替换成GPU版本

使用pip命令pip uninstall torch就可以卸载当前的torch版本。&#xff08;不是cpu版本一般也没有必要重装吧&#xff1f;&#xff09; 接着找到官网https://pytorch.org/get-started/locally/ 在里面选择 根据你自己的需要选择最新的&#xff08;我现在是11.8&#xff09;或者没…

React渲染机制及相关优化方案

React渲染机制及相关优化方案 前言&#xff1a;一、react渲染步骤二、concurrent机制以及产生作用的机会1. 优先级调度&#xff1a;2. 递增式渲染&#xff1a; 三、简单模拟实现 concurrent mode 的递增式渲染四、与优先级调度有关的两个hooks1. useTransition2. useDeferredVa…

KBP210-ASEMI大功率LED驱动器桥堆KBP210

编辑&#xff1a;ll KBP210-ASEMI大功率LED驱动器桥堆KBP210 型号&#xff1a;KBP210 品牌&#xff1a;ASEMI 封装&#xff1a;KBP-4 恢复时间&#xff1a;≥200n0s 正向电流&#xff1a;2A 反向耐压&#xff1a;1000V 芯片个数&#xff1a;4 引脚数量&#xff1a;4 …

RocketMQ5.0消息消费<一> _ PUSH模式的消息拉取

RocketMQ5.0消息消费&#xff1c;一&#xff1e; _ PUSH模式的消息拉取 一、消息消费概述 消息消费以组的模式开展&#xff0c;一个消费组内有多个消费者&#xff0c;每一个消费者可订阅多个主题&#xff0c;消费组之间有两种消费模式&#xff1a;集群模式&#xff08;默认&a…

文字识别(OCR)介绍与开源方案对比

目录 文字识别&#xff08;OCR&#xff09;介绍与开源方案对比 一、OCR是什么 二、OCR基本原理说明 三、OCR基本实现流程 四、OCR开源项目调研 1、tesseract 2、PaddleOC 3、EasyOCR 4、chineseocr 5、chineseocr_lite 6、cnocr 7、商业付费OCR 1&#xff09;腾讯…

vue+Element 设置头部固定,并解决遮罩层显示问题

通过整体框架代码可以看到&#xff0c;其实element-ui已经实现了头部固定 找到这个fixedHeader&#xff0c;发现直接在全局设置文件里 这里如果设置为false&#xff0c;就表示头部不固定&#xff1b;改为true&#xff0c;则表示头部固定。 上述更改完后&#xff0c;就可以实…