C/C++ C++入门

news2025/2/4 2:17:12

个人主页:仍有未知等待探索-CSDN博客

专题分栏:C++_仍有未知等待探索的博客-CSDN博客

目录

一、C++关键字

二、命名空间

1、区别

1. C语言

​编辑 2. C++

2、命名空间定义

 3、命名空间的使用

三、C++输入&输出

四、缺省参数

五、函数重载

六、引用

使用注意:

引用和指针的区别:

 引用的使用:

七、内联函数

八、auto关键字(C++11)

九、基于范围的for循环(C++11)

十、指针空值---nullptr(C++11)


一、C++关键字

下列的关键字有的我们在C语言中就已经见过了,而有些比较陌生,不过不用慌,这些现在不用死记,以后多用就记住了。

二、命名空间

在C/C++中,变量,函数和类的名称都存在于全局作用域中,而C++为了避免这样的命名冲突和名字污染,添加了命名空间域。(关键字:namespace)

全局作用域和命名空间域就类似于这样(如果理解不对,请指教),相当于单独开了一个空间给命名空间域。

1、区别

1. C语言

在没有命名空间的C语言语法里这样写就是错误的,报错信息可以看见:rand重定义。

 2. C++

定义了一个命名空间,在命名空间里面定义了一个rand变量,这样的话就不会和库函数里面的rand函数产生命名冲突。(:: 这个符号作用域限定符)

2、命名空间定义

#include <iostream>

// 正常定义
namespace cpp1
{
	int a = 1;
	int b = 2;

	int Add(int a, int b)
	{
		return a + b;
	}
}
// 嵌套定义
namespace cpp2
{
	int a = 1;
	int b = 2;

	int Add(int a, int b)
	{
		return a + b;
	}

	namespace cpp3
	{
		int a = 1;
		int b = 2;

		int Add(int a, int b)
		{
			return a + b;
		}
	}
}

// 一个工程里面允许定义多个相同的命名空间——编译器最后会合成同一个命名空间中。


int main()
{
	// 打印cpp2里面的函数
	printf("%d\n", cpp2::Add(1, 2));

	// 打印cpp2里面的cpp3里面的函数
	printf("%d\n", cpp2::cpp3::Add(3, 4));
	return 0;
}

 3、命名空间的使用

#include <iostream>

namespace cpp
{
	int a = 1;
	int b = 2;

	int Add(int a, int b)
	{
		return a + b;
	}
}
// 将该命名空间进行展开
// using namespace cpp;

// 将命名空间域里面的变量或者函数进行个别展开
using cpp::a;
int main()
{
	// 用命名空间名称 + 作用域作用符
	// printf("%d\n", cpp::Add(1, 2));

	// 用using + 命名空间名称,将该命名空间进行展开
	// using namespace cpp;

	// 将命名空间域里面的变量或者函数进行个别展开
	// std::cout << a << std::endl;
    // 该语句有错误————变量b未定义
	// std::cout << b << std::endl;

	return 0;
}

三、C++输入&输出

// 如果是自己做题, 可以将std这个命名空间域进行展开 using namespace std;

// 如果是写工程的话,不建议展开
#include <iostream>

int main()
{
	int a = 10;

    // C++没有占位符(格式输出符 : %d ···)
	std::cin >> a; // 输入
	std::cout << a;// 输出
	return 0;
}

四、缺省参数

说白了就是函数传参的时候,可以进行默认传值(如果没有传值的话)。

缺省参数的初始化的顺序是有要求的,必须是连续的,必须从最右侧开始读入。

#include <iostream>

namespace C
{
	// C语言写法
	int Add(int a, int b)
	{
		return a + b;
	}
}

namespace Cpp
{
	// C++缺省参数写法
	int Add(int a = 5, int b = 0)
	{
		return a + b;
	}
	// 也可以只缺省一个参数(数目没有要求)
	int sub(int a, int b = 2)
	{
		return a * b;
	}
}

int main()
{
	// endl 的作用是 插入一个换行符,并且刷新输出流
	std::cout << C::Add(1, 2) << std::endl; 

	std::cout << Cpp::Add(1, 2) << std::endl;
	std::cout << Cpp::Add(1) << std::endl;
	std::cout << Cpp::Add() << std::endl;
	std::cout << Cpp::Add(1) << std::endl;
	return 0;
}

五、函数重载

函数重载的意义是,允许有多个功能类似的同名函数的存在。(就比如说实现一个加法函数,可以有整型的加法函数,也可以有浮点型的加法函数等等,实现的都是加法的功能,如果要用函数名进行区别的话,比较不友好)

要求:函数的参数类型、参数类型顺序、个数不完全一样。

六、引用

引用:就相当于是给一个变量起了一个别名。

用值作为参数进行传递,形参会形成一份临时拷贝,效率低下。(建议用引用作为形参的类型)

使用注意:

1:用引用的时候,必须进行初始化。

2:引用类型必须和引用实体的类型一样。

3:变量引用完之后不能进行修改。

int a = 10;
int b = 4;
int& c = a;
// 不允许对c进行修改指向的操作
// c = b;

4:一个变量可以多次进行引用。

5:常引用:const int &a=b就相当于 const int * const a=b。不仅仅是a这个地址不可修改,而且其指向的内存空间也不可修改。

引用和指针的区别:

  • 在语法层面,引用不是定义一个新的变量,而是给已有的变量去了一个别名,编译器不会为引用变量开辟空间,引用和引用的变量公用一个空间。
  • 在底层层面,引用的底层也是用指针实现的,也开辟了空间。
  • 指针是新开辟了一个空间,来专门的存变量的地址。
  • 没有空引用,但有空指针。
  • 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节)
  • 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  • 没有多级引用,有多级指针。
  • 引用不需要自己进行解引用,指针需要。
  • 引用比指针更安全(因为没有野指针,空指针的问题)。

 引用的使用:

1、做参数:见下面代码。
2、做函数返回值:

        1)不能返回局部变量的引用。

        2)不能返回函数内部new分配的内存的引用。

        3)可以返回类成员的引用,但最好是const。

#include <iostream>
using namespace std;

// 如果是学C语言的时候,我们写交换函数是传的变量的地址,通过对变量地址的解引用来操作变量的内容。
// 现在我们可以用一个引用类型进行接收,相当于我们还是对原来的变量进行修改(可以从例子看出来,取别名可以是相同的)
void swap(int&a, int &b)
{
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
}

int main()
{
	int a = 5, b = 6;
	
	swap(a, b);

	cout << a << " " << b;
	return 0;
}
#include <iostream>
using namespace std;

int main()
{
	int a = 10;
	int& b = a;

	b = 3;
	cout << a;
	return 0;
}

七、内联函数

1、如果内联函数的代码量比较大的时候,不建议用内联函数,

2、inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址 了,链接就会找不到。

内联函数其实对标的就是C语言中的宏函数。

如果让你写一个宏函数的话,可能会漏洞百出,比较的麻烦。

// 写一个加法的宏函数

// 错误写法一
#define Add(a, b) a + b

// 错误写法二
#define Add(a, b) a + b;

// 错误写法三
#define Add(a, b) (a + b)

// 正确写法
#define Add(a, b) ((a) + (b))

而为了解决这样的问题,C++引入了一个内联函数的语法,和宏函数一样,在编译时,编译器会在调用的地方进行展开。 

#include <iostream>
using namespace std;

// 内联函数在函数的基础上加上一个inline的关键字。
inline int Add(int a, int b)
{
	return a + b;
}

int main()
{
	cout << Add(1, 2);

	return 0;
}

八、auto关键字(C++11)

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

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;
}

九、基于范围的for循环(C++11)

#include <iostream>
using namespace std;


int main()
{
	int a[] = {1, 2, 3};
	for (auto x : a)
	{
		cout << x << " ";
	}
	return 0;
}

十、指针空值---nullptr(C++11)

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

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

3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

谢谢大家!

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

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

相关文章

80.如何评估一台服务器能承受的最大TCP连接数

文章目录 一、一个服务端进程最多能支持多少条 TCP 连接&#xff1f;二、一台服务器最大最多能支持多少条 TCP 连接&#xff1f;三、总结 一个服务端进程最大能支持多少条 TCP 连接&#xff1f; 一台服务器最大能支持多少条 TCP 连接&#xff1f; 很多朋友可能第一反应就是端…

【RT-DETR有效改进】利用YOLO-MS的MSBlock模块改进ResNet中的Bottleneck(RT-DETR深度改进)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是利用YOLO-MS提出的一种针对于实时目标检测的MSBlock模块(其其实不能算是Conv但是其应该是一整个模块),我们将其用于替换我们ResNet中Basic组合出一种新的结构,来替换我们网络中的…

Spring:JDBCTemplate 的源码分析

一&#xff1a;JdbcTemplate的简介 JdbcTemplate 是 Spring Template设置模式中的一员。类似的还有 TransactionTemplate、 MongoTemplate 等。通过 JdbcTemplate 我们可以使得 Spring 访问数据库的过程简单化。 二&#xff1a;执行SQL语句的方法 1&#xff1a;在JdbcTempla…

智能末世战争之机器人的反击

在遥远的未来&#xff0c;地球陷入了一场空前的战争。这场战争不同于以往的任何战争&#xff0c;因为这是由人工智能和机器人主导的战争。在战争爆发之前&#xff0c;人类一直依赖AI和机器人来提高生产效率和生活质量。然而&#xff0c;随着AI技术的飞速发展&#xff0c;机器人…

H5 简约四色新科技风引导页源码

H5 简约四色新科技风引导页源码 源码介绍&#xff1a;一款四色切换自适应现代科技风动态背景的引导页源码&#xff0c;源码有主站按钮&#xff0c;分站按钮2个&#xff0c;QQ联系站长按钮一个。 下载地址&#xff1a; https://www.changyouzuhao.cn/11990.html

flinkcdc 3.0 尝鲜

本文会将从环境搭建到demo来全流程体验flinkcdc 3.0 包含了如下内容 flink1.18 standalone搭建doris 1fe1be 搭建整库数据同步测试各同步场景从检查点重启同步任务 环境搭建 flink环境(Standalone模式) 下载flink 1.18.0 链接 : https://archive.apache.org/dist/flink/flink…

【大数据】专业融合型人才迎来发展良机-国家数据局正式揭牌

⭐简单说两句⭐ 作者&#xff1a;后端小知识 CSDN个人主页&#xff1a;后端小知识 &#x1f50e;GZH&#xff1a;后端小知识 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 摘要&#xff1a; 新华社北京10月26日电 《中国证券报》26日刊发文章…

shell - 正则表达式和grep命令和sed命令

一.正则表达式概述 1.正则表达式定义 1.1 定义 使用字符串描述、匹配一系列符合某个规则的字符串 1.2 了解 普通字符&#xff1a; 大小写字母、数字、标点符号及一些其它符号元字符&#xff1a; 在正则表达式中具有特殊意义的专用字符 1.3 层次分类 基础正则表达式扩展正…

git修改密码后mac使用sourceTree出现Authentication failed错误

1、退出sourceTree 2、在钥匙串中删除git对应站点Access Key 3、执行命令&#xff1a;git config --system --unset credential.helper 4、重新启动sourceTree&#xff0c;这时会弹出输入密码框&#xff0c;重新输入密码即可

react 之 UseMemo

useMemo 看个场景 下面我们的本来的用意是想基于count的变化计算斐波那契数列之和&#xff0c;但是当我们修改num状态的时候&#xff0c;斐波那契求和函数也会被执行&#xff0c;显然是一种浪费 // useMemo // 作用&#xff1a;在组件渲染时缓存计算的结果import { useState …

树——二叉搜索树

二叉搜索树 概述 随着计算机算力的提升和对数据结构的深入研究&#xff0c;二叉搜索树也不断被优化和扩展&#xff0c;例如AVL树、红黑树等。 特性 二叉搜索树&#xff08;也称二叉排序树&#xff09;是符合下面特征的二叉树&#xff1a; 树节点增加 key 属性&#xff0c;用来…

Git介绍与常用命令总结

Git介绍与其常用命令总结 1、Git介绍2、Git的使用3、Git常用命令3.1 初始化仓库3.2 克隆仓库3.3 配置用户信息3.4 提交代码(Commit)3.5 推送代码(Push)3.6 拉取代码(Pull)3.7 分支(Branch)3.8 远程仓库(Remote)3.9 撤销回退本地改动3.10 更新本地仓库与远程仓库 1、Git介绍 Gi…

编程流程图

对于复杂流程&#xff0c;我做开发之前一般会 先画一下流程图。特别是多个部门有交叉的情况下&#xff1a; processOn&#xff1a; 这个是我之前 一直的选择&#xff0c;他可以画上面的这些&#xff0c;流程图&#xff0c;网页操作&#xff0c;但是他不是免费的&#xff0c;查过…

【LVGL环境搭建】

LVGL环境搭建 win模拟器环境搭建一.二.三.四.五. Ubuntu模拟器环境搭建一. 前置准备二. 下载LVGL Source code&#xff1a;三. 安装sdl2&#xff1a;四. 开启VScode执行五. 安装扩展套件六. 按F5执行七. 执行结果 win模拟器环境搭建 一. 二. 三. 四. 五. Ubuntu模拟器环境…

同城上门预约软件开发:改变生活服务模式

随着互联网技术的飞速发展&#xff0c;人们的生活方式也在发生着深刻的变化。特别是在生活服务领域&#xff0c;新的需求和模式不断涌现。其中&#xff0c;同城上门预约服务正逐渐成为一种新的趋势。本文将探讨开发同城上门预约软件的意义、市场需求、功能设计以及面临的挑战。…

C++类和对象入门(一)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、面相过程和面向对象的初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#…

大语言模型之LlaMA系列-LlaMA 2及LlaMA_chat(下)

多转一致性的系统消息 - System Message for Multi-Turn Consistency 在对话设置中&#xff0c;某些指示应适用于所有对话轮次。 例如&#xff0c;简洁地响应&#xff0c;或"充当"某个公众人物。当我们向Llama 2-Chat提供此类指示时&#xff0c;后续应响应始终遵守约…

专业139总分400+南昌大学811信号与系统考研经验电子信息与通信工程集成电路

今年专业课811信号与系统139分&#xff0c;总分400&#xff0c;顺利上岸南昌大学&#xff0c;回首这一年的复习&#xff0c;有很多经验想和大家分享&#xff0c;希望对大家复习会有一些帮助。专业课&#xff1a;139分&#xff0c;811信号与系统 主要参考书&#xff1a;《信号与…

2024年人工智能应用与先进制造科学国际学术会议(ICAIAAMS 2024)

2024年人工智能应用与先进制造科学国际学术会议(ICAIAAMS 2024) 2024 International Conference on Artificial Intelligence Applications and Advanced Manufacturing Science (ICAIAAMS 2024) 会议简介&#xff1a; 2024年人工智能应用与先进制造科学国际学术会议&#xff…

C语言基础:头歌练习数组练习

&#xff08;字符串插入&#xff09; 任务描述 题目描述:输入两个字符串a和b&#xff0c;将b串中的最大字符插入到a串中最小字符后面。 样例输入&#xff1a; MynameisAmy MynameisJane 样例输出&#xff1a; MynameisAymy 题目分析&#xff1a;a字符串中最小的字符是A…