C到C++——C++基础

news2024/11/6 9:35:19

C++是一种通用的、静态类型的、跨平台的编程语言。它是在1979年由Bjarne Stroustrup创建的,最初是作为C语言的扩展来支持面向对象编程。

C++在保留C语言的特性的同时,添加了许多其他的功能,包括类、对象、继承、多态、模板等。这使得C++成为了一种强大而灵活的编程语言,可以用于开发各种类型的应用程序,包括系统级软件、嵌入式系统、游戏开发、图形界面等。

C++也是一种高效的语言,其执行速度接近于C语言,因为它允许直接访问硬件和内存,并支持底层的操作。

C++还具有丰富的标准库,提供了许多常用的函数和数据结构,可以方便地进行文件操作、输入输出、字符串处理等。

总的来说,C++是一种功能强大、高效、灵活的编程语言,广泛应用于软件开发领域。

在系统的了解C++之前,我们要了解一些C++基础,以便我们后面更好的理解其他内容。大家也可以借助这一篇来了解C++对C有何变化:C++对C的扩充-CSDN博客

一.命名空间

1.1同名冲突

当我们在编写程序的时候,如果在一个作用域中出现了两个或多个同名的变量或者函数就会发生错误

int main()
{
	int a = 0;

	//……

	int a = 0;
	return 0;
}

我们在主函数这个作用域中定义了两个a变量,在编译的时候就会报错。这就是同名冲突。 

同名冲突是在大型应用软件的设计过程中是非常容易发生的。比如程序员A在头文件codeA中定义了student类和fun函数,程序员B在头文件codeB中也定义了student类和fun函数。而当主程序员使用A、B写的功能时要包含其头文件,但是当包含之后,就会在编译时发生错误,因为头文件在编译时会展开,这就意味着在一个程序中同时出现了两个studen类和fun函数,此时就会导致编译失败,因为发生了同名冲突。

1.2命名空间

 为了解决这个问题,ANSIC++增加了命名空间(namespace)。所谓命名空间,实际上就是一个由程序设计者命名的内存区域。程序设计者可以根据需要指定一些有名字的空间作用域,把一些全局实体分别放在各个命名空间中,从而与其他全局变量实体分割开来。

命名空间的定义格式为:

namespace 命名空间名
{
	//命名空间成员
}

 如:定义一个名为xiasicheng的命名空间

namespace xiasicheng
{
	//命名空间成员
	const int a = 10;

	int a = 2;

	int func()
	{
		cout << "hello" << endl;
	}

	struct student
	{
		int age;
		char name[10];
	};


}

 命名空间的作用时建立一些互相分隔的作用域,把一些全局实体分隔开来,以免产生名字冲突。

在声明一个命名空间时花括号内不仅可以可以包含变量,还可以包含一下类型:

  • 变量(可以初始化)
  • 常量
  • 函数(可以是定义也可以是声明)
  • 结构体
  • 模板
  • 命名空间(命名空间的嵌套)
namespace xiasicheng
{
	//命名空间成员
	const int a = 10;

	namespace xiasicheng2
	{
		int b = 0;
	}
}

需要注意的是,命名空间不会改变变量的生命周期,本来是全局变量,定义在命名空间中还是全局变量。 

1.3命名空间的使用 

1.3.1指定命名空间访问

 当我们需要使用命名空间中的成员时,要用命名空间名和作用于限定符对命名空间成员进行限定,以区别不同的命名空间中可能有同名的标识符:即

//命名空间名::命名空间中的成员名
cout << xiasicheng::a << endl;

 但是当命名空间名字比较长,并且还要多次引用其成员时,就会非常不方便。

为此,C++提供了一些机制,能简化使用命名空间中成员的方法

1.3.2使用命名空间的别名

可以为命名空间起一个别名,用来代替较长的命名空间名。

如:

namespace Television
{
	int a = 0;
}

namespace TV = Television;//用TV代替Television

int main()
{
	cout << Television::a << endl;
	cout << TV::a << endl;

	return 0;
}

1.3.3使用using将命名空间中某个成员展开

using后面的成员名必须是由命名空间名限定的名字。例如:

using TV::a;

它表示在using语句所作用的作用域中可以用TV命名空间中的成员a,而且不必再逐个用命名空间名限定了。当我们要再使用变量a时,直接调用即可: 

cout << a << endl;//相当于cout << TV::a << endl;

但是要注意,在同一作用域中用using声明的不同命名空间的成员不能有同名的成员。 

1.3.4使用using namespace展开命名空间 

C++提供了using namespace 语句来实现一次性展开命名空间,一般格式为:

using namespace 命名空间名;

当我们利用该语句展开某个命名空间之后,该命名空间中的所有成员都可以直接进行访问,不必再使用作用于限定符限定或者using语句声明某一个成员。 

 当是在使用using namespace 和using展开某一个成员时,都存在风险,所以在项目中时,建议使用命名空间名+作用于限定符的方式来访问变量。

二.C++的输入输出

C++有一套自己的输入输出方式,我们可以使用cout来实现输出,cin实现输入。它们是C++的标准输出流和输入流。

int a = 0;
cin >> a;
cout << a << endl;

因为C++是包含C的,所以在我们的C++程序中,也可以使用C语言的输入输出方式,但是C++的输入输出有一个很好的东西,那就是可以自定识别类型。我们不再像C语言那样要进行格式控制,我们C++直接写入变量名即可,不必控制变量的类型,cout和cin会自动识别的。 

int main()
{
	int a = 0;

	cin >> a;
	scanf("%d", &a);

	cout << a << endl;
	printf("%d\n", a);

	return 0;
}

其实cout和cin也是包含在std这个命名空间中的,因为我们再文件开头就展开了std,所以我们不再需要进行限定,所以cout和cin的使用可以借助std和作用域限定符:

std::cin >> a;
std::cout << a << endl;

三.缺省参数

缺省参数也叫做有默认参数的函数,所以缺省参数是应用在函数模块中的。其含义就是在定义函数时,给形参一个默认值,当我们调用该函数时,如果没有传实参,该函数就会使用这个默认值,如果传了实参,该函数就会使用该实参而屏蔽掉缺省参数。

int MAX(int a = 0, int b = 0)
{
	return a > b ? a : b;
}

当一个函数有多个形参时,其可以分为全缺省,半缺省,不缺省:

全缺省就是其形参每一个都带有默认值,传参数时,可以只传一个,也可以传多个,传了就用实参,没传的就用缺省值。 

半缺省就是只有一部分形参有缺省值,当一个函数是半缺省时,其带有缺省值的形参必须在形参表列的最右边。

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

如果缺省值跳跃,在传参时就会产生歧义:

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

int main()
{
	func(2);
	return 0;
}

此时,2是传给a呢?还是b呢?所以为了避免该情况的出现,带缺省值的形参应在形参表列的最右边。 

四.变量的引用

引用(reference)是C++对C的一个重要扩充

4.1引用的概念

在C++中,变量的“引用”就是变量的别名,因此引用又叫别名(alias)。建立“引用”的作用是为一个变量再起另一个名字,以便在需要时可以方便、间接地引用该变量,这就是引用名称的由来。当我们给一个变量起了一个别名之后,他们两个占用同一块空间。

int a = 10;
int& b = a;//给a取了一个别名b,a和b占用同一块内存空间

注意:在声明一个别名时,必须同时给出初始化。 

我们打印a和b的地址可以看到它们的地址相同。 当我们修改其中任意一方时,另一方也会发生改变。

4.2引用的特性

4.2.1引用在定义时必须初始化且引用的类型必须和被引用对象的类型相同

int main()
{
	int a = 0;
	int& b = a;//正确

	int& c;//没有初始化

	double& d = a;//引用类型与被引用类型不同

	return 0;
}

4.2.2一个变量可以有多个引用

int a = 0;
int& b = a;
int& c = a;
int& d = a;

当我们打印它们的地址时,它们都指向的是同一块空间: 

4.2.3引用在初始化后不能再被重新声明为另一个变量的别名 

int main()
{
	int a = 0;
	int& b = a;//b是a的别名

	int c = 10;
	&b = c;//企图让b成为c的别名,错误

	return 0;
}

4.2.4对于引用的初始化,可以用一个变量名,也可以用另一个引用

int main()
{
	int a = 10;
	int& b = a;
	int& c = a;//用变量初始化

	int& d = b;//用另一个引用初始化
	return 0;
}

4.3引用作为函数参数 

用引用作为函数参数时,可以代替传地址的方式使实参改变,当函数形参为引用时,实参直接传变量也会改变。

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

 我们可以对比引用传参和指针传参的区别,引用传参会更加方便,如果使用指针的话还要对变量进行解引用。

4.4const引用

const引用可以作为普通变量的别名,也可以作为const变量的别名。前者属于权限缩小,或者属于权限平移。

int a = 0;
const int& b = a;

此时b不可以改变,但是a可以改变。 此时属于权限缩小,原来a可写可读,b只能读不能写。

const int c = 100;
const int& d = c;

 此时c和d都不能改变。此时属于权限平移,原来c只可读不可写,d也只能读不能写。

需要注意的是,权限只能平移或者缩小,但不能放大。

const int e = -1;
int& f = e;

e只可读,但f作为e的引用可读可写,此时权限放大,运行会出错。 

 4.5const引用中的常属性临时变量

double a = 1.2;
int& b = a;

a是浮点型,而想给其取一个int型的别名。此时会发生隐式转化,a会隐式转化为整型储存在临时变量中,而临时变量具有常属性,只可读,但是给其取别名时发生了权限放大,所以上面的写法是错误的。

正确的方法是用const引用接收:

double c = 2.2;
const int& d = c;

 4.6引用和指针的关系

C++中引用是引用,指针是指针,两者相辅相成。

  • 语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。
  • 引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。
  • 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。
  • 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。
  • sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下 占4个字节,64位下是8byte)。
  • 指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些。

 

五.重载函数

C++中的输入输出语句中用到的<<和>>叫做流插入操作符和流提取操作符。而在C语言中,它们作为位运算符,这叫做运算符重载,即一物多用。

而重载函数也叫函数重载,也就是一物多用的意思,同名函数有着不同的作用。

C++允许在同一作用域中用同一函数名定义多个函数,这些函数的参数个数和参数类型不相同,用来实现不同的功能。这就是函数重载,即一个函数名多用

int ADD(int x, int y)
{
	return x + y;
}

double ADD(double x, double y)
{
	return x + y;
}

对上面两个函数而言,实现了整数相加和浮点数相加的功能,当我们调用ADD函数时,该函数会根据参数的不同,调用不同的函数。这就是函数重载的体现。 

但是函数重载的前提是:函数的形参表列不同

  • 形参个数不同
  • 形参类型不同
  • 形参个数和类型都不同
  • 形参顺序不同

需要注意的是,函数重载跟返回值类型无关,返回值不同,形参相同的两个函数不能设计为重载函数。 

六.inline

inlne是C++的一个关键字,它可以使一个函数成为内联函数。

调用函数时需要建立函数栈帧,这需要时间,当一个函数被频繁调用时,就会加大时间的消耗,导致程序效率降低。C++提供了一种提高效率的方法,即在编译时将所调用函数的代码嵌入到主调函数中。这种嵌入到主调函数中的函数称为内联函数,又称内置函数。

inline int ADD(int x, int y)
{
	return x + y;
}

当我们调用该函数时,其就会在调用出展开: 

int main()
{
	ADD(1, 2);

	return 0;
}
//展开
int main()
{
	return 1 + 2;

	return 0;
}

 其实,inline的出现是为了替代C语言中的宏。因为宏是一种文本替换不进行类型检查,不安全。所以C++就引入了inline这一关键字。

但是函数是否展开是跟编译器有关的。当你将一个函数定义为inline时,编译器会检查你设置的是否合理,如果合理,编译器就会在调用出展开;否则,就不展开。

将一个函数定为内联函数的前提是,该函数代码量少(10行之内),且会被频繁调用。  

七.nullptr

nullptr是C++11引入的一个空指针常量。在C++中,空指针通常用NULL或0来表示,但这种表示方式可能存在一些模糊性和歧义。为了解决这个问题,C++11引入了nullptr作为一个明确的空指针常量。

nullptr可以被赋值给指针类型的变量,表示该指针不指向任何有效的内存地址。使用nullptr可以提高代码的可读性和安全性,因为它可以更清晰地表示一个空指针。另外,nullptr还可以与其他指针进行比较操作,以判断指针是否为空。

示例代码:

int* ptr = nullptr; // 定义一个指向整型的空指针

if (ptr == nullptr) {
    // 检查指针是否为空
    // 执行相关操作
}

总的来说,nullptr是C++中用于表示空指针的常量,它在C++11中被引入,提高了代码的可读性和安全性。


完!

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

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

相关文章

“金牌挑战——奥运知识大比拼”微信小程序线上知识竞赛答题活动复盘总结

一、活动背景 奥运会进行得如火如荼&#xff0c;为了弘扬奥运精神&#xff0c;激发公众对于奥林匹克运动的兴趣和热情&#xff0c;我们特别策划了“金牌挑战——奥运知识大比拼”线上知识竞赛活动。本次活动依托微信小程序&#xff0c;通过趣味性和互动性强的知识竞答&#xf…

SOPHGO算能科技BM1684盒子占用空间满的问题解决

目录 1 问题由来 2 问题排查与解决 1 问题由来 安装软件的时候发现&#xff0c;软件根本安装不上了&#xff0c;用df -h看到根目录已经满了 rootbm1684:~# df -h Filesystem Size Used Avail Use% Mounted on overlay 5.8G 5.7G 0 100% / devtmpfs …

【实战】MFC客户端Python后端之仿造QQ聊天

项目概述 这里介绍一个很多年以前做的一个小项目&#xff0c;新手小白可以参考学习。本项目旨在开发一个功能丰富的即时通讯及聊天室系统&#xff0c;类似于QQ&#xff0c;具备客户端与服务端通讯、多人聊天室、界面友好度、一对一聊天、通讯内容加密、服务端与数据库交互等功能…

十八.核心动画 - 使用CAGradientLayer图层构建渐变视图

引言 在现代的UI设计中&#xff0c;渐变色和圆角已经成为了不可或缺的元素。无论是应用程序的背景&#xff0c;按钮&#xff0c;还是图标&#xff0c;这些设计趋势不仅使界面更加美观&#xff0c;还能提升用户体验。特别是渐变色&#xff0c;它通过颜色的平滑过渡&#xff0c;…

如何利用绩效考核来强化员工对TPM的参与度?

TPM&#xff08;Total Productive Maintenance, 全面生产维护&#xff09;作为一种追求生产系统效率最大化的管理模式&#xff0c;其核心在于通过全员参与和持续改进&#xff0c;实现设备综合效率的最大化。然而&#xff0c;要让这一理念深入人心&#xff0c;并转化为员工的日常…

图片转为pdf怎么弄?亲测有效的8个pdf转换方法安利

图片转PDF怎么弄&#xff1f;在日常的办公生活中&#xff0c;我们经常会需要处理一些文档格式转换难题&#xff0c;图片转成PDF格式就是其中一个&#xff0c;图片转换成PDF格式的话&#xff0c;方便我们传输分享&#xff0c;毕竟现在PDF格式凭借着自身的稳定性和可移植性已经成…

李晨晨的嵌入式学习 DAY20

今天主要对zuot学习函数进行了补充 一&#xff0c;文件IO函数 1.fileno函数 类型转换函数 函数原型&#xff1a;int fileno(FILE *stream); 功能&#xff1a;fileno函数用于取得参数stream指定的文件流所使用的文件描述符。文件描述符是一个非负整数&#xff0c;用于在底层…

C/C++开发,opencv光流法跟踪特征点

目录 一、Lucas-Kanade光流法 1.1cv::ORB特征点提取方法 1.2 cv::calcOpticalFlowPyrLK函数 二、完整案例实现 2.1 程序代码 2.2 程序编译及输出 2.3 读取视频文件方式补充 一、Lucas-Kanade光流法 在 OpenCV 中&#xff0c;使用 特征检测器(例如ORB ,Oriented FAST and…

基于深度学习的地磁活动、扰动预测模型

注&#xff1a;包括SYM-H Index和Storm Intensity index A transformer-based framework for predicting geomagnetic indices with uncertainty quantification Journal of Intelligent Information Systems 18 November 2023 A transformer-based framework for predicting…

IP地址怎样实现安全的HTTPS访问?

IP实现HTTPS访问是一个涉及证书申请、服务器配置及网络安全的过程。以下是实现IP实现HTTPS访问的详细步骤&#xff1a; 公网IP地址的重要性&#xff1a;要实现HTTPS访问&#xff0c;必须拥有一个公网IP地址&#xff0c;这是从互联网直接访问网站的基础条件。 管理权限的必要性&…

高效批量提取PPT幻灯片中图片的方法

处理包含大量图片的PPT&#xff08;PowerPoint&#xff09;幻灯片已成为许多专业人士的日常任务之一。然而&#xff0c;手动从每张幻灯片中逐一提取图片不仅耗时耗力&#xff0c;还容易出错。为了提升工作效率&#xff0c;减少重复劳动&#xff0c;探索并实现一种高效批量提取P…

“网络信息安全”你真的了解吗?(非常详细)零基础入门到精通,收藏这一篇就够了

全面了解网络信息安全 01 导语&#xff1a; 在数字化浪潮中&#xff0c;我们每个人的生活都越来越依赖于网络。银行账户、个人隐私、企业机密——几乎所有的敏感信息都在网络上流转。随之而来的是不断升级的网络攻击和诈骗手段。本文将深入探讨网络信息安全的意义、挑战、防…

Candance Allegro 入门教程笔记:Cadence Allegro 17.4安装教程

文章目录 一、安装Cadence Allegro 17.4 安装包二、安装Candance Allegro Manager三、安装007号 补丁四、用阿狸狗破戒大师 破戒Candance Allegro 17.4软件 Cadence Allegro QQ交流学习裙&#xff1a;173416628 凡亿教育的Candance Allegro 17.4基础教程 小哥Cadence Allegro …

SSM伊犁旅游攻略网站—计算机毕业设计源码15961

目 录 摘要 1 绪论 1.1 开发背景 1.2开发意义 1.3ssm框架 1.4论文结构与章节安排 2 2 伊犁旅游攻略网站系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1功能性分析 2.3.2非功能性分析…

48天笔试训练错题——day43

目录 选择题 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 编程题 1. 求和 选择题 1. synflood 是 syn 泛洪攻击。有一个恶意主机&#xff0c;伪造大量的 IP 地址&#xff0c;然后给服务器发送 SYN 请求&#xff0c;但是不进行第三次握手的回复&#xff0c;这样就会消耗服务器…

DITA发布MS Word样式定制

- 1 - 概述 上一期我们介绍了摩拿科技针对DITA发布PDF样式定制。 发布PDF通常能够满足大部分手册内容查看的需求&#xff0c;但是有时候公司的销售和服务部门的同事或者客户想要一个能修改的文件&#xff0c;这样可以做二次加工并生成自己想要的输出。这时候MS Word就能胜任…

SpringBoot中使用过滤器filter

过滤器Filter 在 Java 中&#xff0c;Filter&#xff08;过滤器&#xff09;是一种用于对请求进行预处理和后处理的机制。 工作原理&#xff1a; 当一个请求到达服务器时&#xff0c;会先经过一系列配置好的过滤器。过滤器可以检查请求的参数、头信息、请求体等内容&#xf…

buuctf CrackRTF (补)

另一种做题方式。 前言&#xff1a;学习笔记。 例题学习&#xff0c;涨大知识。 深入刨析&#xff0c;学习。 常规什么的这次就不写了&#xff0c;这篇wp主要是用于学习&#xff0c;以及分析。 以资料&#xff0c;代码理解&#xff0c;编程思维、编程手法等为主。 重在分析学…

php常见代码执行函数和常见系统命令执行函数。

PHP中常见代码执行函数&#xff1a; array_map() eval() assert() preg_replace() call_user_func() $a($b)动态函数 PHP中常见系统命令执行函数&#xff1a; system() exec() shell_exec() passthru() popen() 反引号"" 命令执行危险函数之assert函数…

成都云飞浩容文化传媒有限公司正规吗怎么样?

在数字经济的浪潮中&#xff0c;电商行业如日中天&#xff0c;成为推动经济增长的重要引擎。在这片蓝海中&#xff0c;如何脱颖而出&#xff0c;实现品牌与销量的双重飞跃&#xff1f;成都云飞浩容文化传媒有限公司&#xff0c;作为电商服务领域的佼佼者&#xff0c;正以专业的…