前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【C++初阶】:C++入门篇(一)

【C++初阶】:C++入门篇(一)

作者头像
爱喝兽奶的熊孩子
发布于 2024-08-21 06:49:04
发布于 2024-08-21 06:49:04
16300
代码可运行
举报
文章被收录于专栏:C语言基础C语言基础
运行总次数:0
代码可运行

前言

C++是在C语言的基础之上,增加了一些面向对象的编程思想,增加了一些有用的库,所以有了学习C语言的经验,学习C++其实很容易的。至于C++初阶,我们可以认为C++的出现其实就是为了弥补C语言在某些方面的不足之处。所以从这篇开始,一起来学习C++,以及C++到底弥补了C语言的哪些不足。

一、C++命名空间

学过C++的人都知道,在学习C++的过程中,比如在某些视频教程中,教我们写的第一个程序往往都是打印hello world,但是每次在写的过程中,老师们都叫我们去忽略一些东西,比如using namespace std; 那这句话到底有什么用呢?

无论是C语言还是C++,在同一个局部域里面是不允许出现相同的变量名的,在同一个作用域下定义了两个相同变量名的变量会导致访问冲突,编译器不知道该使用哪个变量,从而导致报错。不仅仅是变量名,函数名相同也是一样的(C++函数重载除外)。这也导致在一群人写同一个项目时,写完在合并之后可能导致函数名或变量名冲突的问题,为解决这个问题,C++的命名空间孕育而生。

命名空间的目的就是对标识符的名称进行本地化避免命名冲突或名字污染,namespace关键字就是为了解决这样的问题。

1.1 命名空间的定义

定义命名空间时,需要用到namespace这个关键字,后面紧跟命名空间的名字,再接一队 {}{} 中为命名空间的成员。 一个命名空间就是定义了一个新的作用域,命名空间的所有内容都局限于这个命名空间中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace N1  // 命名空间N1
{
	int a = 10;
	void test()
	{
		printf("test() a = 10\n");
	}
}

namespace N2  // 命名空间N2
{
	int a = 20;
	void test()
	{
		printf("test() a = 20\n");
	}
	namespace N3  // 命名空间N3, 命名空间的嵌套
	{
		struct Node
		{
			struct Node* next;
			int data;
		};
	}
}
1.2 命名空间的使用

要使用命名空间的内容有三种方法,第一种就是命名空间名称加作用域限定符。 格式:命名空间名称::命名空间成员

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main()
{
	printf("%d\n", N1::a); // :: 是作用域限定符
	N1::test();
	printf("%d\n", N2::a);
	N2::test();
	N2::N3::Node node;
	node.data = 123;
	printf("%d\n", node.data);
	return 0;
}

方法二:使用using将某个命名空间的某个成员引入。 格式:using 命名空间名称::命名空间成员

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using N1::a; // 
using N2::N3::Node;
int main()
{
	printf("%d\n", a);
	printf("%d\n", N2::a);
	Node node;
	node.data = 456;
	printf("%d\n", node.data);
	return 0;
}

方法二:使用using将某个命名空间的某个成员引入。

格式:using 命名空间名称::命名空间成员

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using namespace N2;

int main()
{
	printf("%d\n", a);
	test();
	printf("%d\n", N1::a);
	N1::test();
	N3::Node node;
	node.data = 789;
	printf("%d\n", node.data);
	return 0;
}

注意:使用 using namespace 命名空间名称; 就相当于破坏了作用域之间的封闭性,将命名空间中的成员全部暴露出来了。在日常练习中,建议直接using namespace std即可,这样就很方便。

了解完命名空间后,我们也算知道了为什么每次写C++程序时总要写一句using namespace std; std::是个名称空间标识符,C++标准库中的函数或者对象都是在命名空间std中定义的,所以我们要使用标准库中的函数或者对象都要用std来限定。

C++标准库,C++ Standard Library,是类库和函数的集合,其使用核心语言写成,由c++标准委员会制定,并不断维护更新。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using std::cout;  // 分别将cout和endl释放出来
using std::endl;

int main()
{
	cout << N1::a << endl;
	cout << N2::a << endl;
	N2::N3::Node node;
	node.data = 111;
	cout << node.data << endl;
	return 0;
}
二、C++的输入和输出

C++作为一门新的语言,不但可以兼容C语言,C++自己也有属于自己的独有语法,最典型的就是C++不仅可以使用C语言中的printfscanf,也可以使用自己的输入输出语句,cout(输出)cin(输入),这两个都是全局的流对象,endl是特殊的C++符号,表示换行。 cout标准输出对象(控制台)和cin标准输入对象(键盘)都必须包含iostream头文件以及按照命名空间使用方法使用stdcoutcin分别是ostreamistream类型的对象,<<>> 分别是流插入运算符流提取运算符,实际是运算符重载过来的。

2.1 cin和cout的使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
using std::cout;
using std::cin;
using std::endl;

int main()
{
	int a = 0;
	cin >> a; // cin和cout可以自动识别类型
	cout << a << endl;
	return 0;
}
三、缺省参数

缺省参数就是在给函数声明或定义时给函数的参数一个默认的值,在调用该函数时,如果没有给函数传递实参的话,该函数调用时就会采用该形参的缺省值,如果调用时传递了实参,就采用指定的实参。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void test1(int a = 20)
{
	cout << a << endl;
}

int main()
{
	int a = 10;
	test1();  // 没有传参时,使用参数的默认值
	test1(a);  // 有参数传递时,使用指定的实参
	return 0;
}
3.1 缺省参数的分类
  1. 全缺省参数

函数的每个参数都有自己的默认值,这样的参数就是全缺省参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void test2(int a = 10, int b = 20, int c = 30)
{}
  1. 半缺省参数

函数的部分参数有默认值,其余参数没有参数值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void test3(int a, int b = 10, int c = 20)
{}

半缺省参数必须从右往左依次给,中间不能间隔,传参时也无法指定传参。另外,函数的缺省值不能再声明和定义中同时出现。那么,函数的缺省值是在函数的声明给还是在函数的定义时给呢

其实只要我们仔细想一下就应该知道缺省值应该在函数的声明时给,因为函数往往都是先声明后使用,如果我们在声明函数时没有缺省值,但定义时又给了缺省值,就容易导致声明与定义不一致,另外,修改函数的声明比修改函数的定义要方便。

注意:函数的缺省值必须要是常量或则是全局变量,C语言不支持缺省参数其实就是C语言的编译器不支持。

四、函数重载
4.1 函数重载概念及其条件

自然语言中存在一词多义的现象,其意思需要人去结合上下文去判断,这就是词的重载,所以函数重载就是C++中允许同一个作用域中拥有功能相似的同名函数,同名函数之间的形参列表(形参类型、个数、类型顺序)不同,来处理一些功能类似数据类型不同的问题。

以下四个test01函数都构成函数重载。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 参数个数不同
void test01()
{
	cout << "test01()" << endl;
}
// 参数类型不同
void test01(int a)
{
	cout << "test01(int a)" << endl;
}
// 参数类型顺序不同
void test01(int a, double b)
{
	cout << "test01(int a, double b)" << endl;
}

void test01(double a, int b)
{
	cout << "test01(double a, int b)" << endl;
}

注意:函数的返回值不构成函数重载,因为只有返回值相同的话会造成调用歧义,编译器不知道该调用哪个函数,从而编译报错。

4.2 C++支持函数重载原理 – 名字修饰

C++为什么可以支持函数重载,而C语言为什么不可以支持? 学习C语言的时候,可以知道,一个程序要运行起来,需要经历四个阶段:预处理编译汇编链接

编译之后,会有一个符号表,函数会有自己的名字修饰,像Windows中VS的函数名修饰规则有点复杂,我们可以通过Linux下的gcc来查看函数名修饰规则。 在Linux下我们可以先用gcc编译一下C语言代码,然后通过objdump -S 可执行文件来查看这个汇编代码,从而看C语言下的函数名修饰规则。

通过汇编代码,可以看到C语言下函数名就是修饰后的名字。所以如果C语言中有两个名字相同的函数,那么修饰后的名字也是一样的,编译器不知道该调用哪一个,导致编译报错。

现在我们用g++去编译C++的代码,然后去看一下汇编后函数名会修饰成什么样子。

通过汇编代码可以看到C++不是单纯的用函数名进行修饰的,在函数名的前面加了一个 _Z 的前缀,函数名的后面是函数参数类型的缩写,id就表示该函数的参数类型是int和double类型,而di就表示该函数的参数类型是double和int类型,通过函数调用时传递的实参类型,决定调用哪一个函数。不会存在调用冲突的问题。

这也就是为什么C语言为什么不能支持函数重载的原因(同名函数编译后无法区分),而C++通过函数名修饰规则来区分,只要参数不一样,修饰出来的名字就不一样,也就支持了函数重载。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++入门篇
呀哈喽,我是结衣。 了解完C++的发展历程,我们当然也要会用C++啊。今天这篇博客就是来帮助我们来入门C++的,当然要入门C++当然也要先学会C语言啦。在我学习C++的过程中我会一直把C++博客更新下去的。
Yui_
2024/10/15
1300
C++入门篇
从基础入门到学穿C++(C++语法基础篇)【超详细】【一站式速通】
C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。
see.
2024/06/04
9270
【C++入门篇】学习C++就看这篇--->命名空间、缺省参数及函数重载
C++总计63个关键字,C语言32个关键字,其实不用记忆,后面随着我们日积月累自然而然就记住了。如下所示:
HABuo
2025/05/15
1180
【C++入门篇】学习C++就看这篇--->命名空间、缺省参数及函数重载
【C++】——入门基础知识超详解
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
小李很执着
2024/06/15
2140
【C++】——入门基础知识超详解
C++初阶-入门基础语法
2. 使用C++输入输出更方便,不需增加数据格式控制,比如:整形--%d,字符--%c
用户9645905
2022/11/30
7750
C++初阶-入门基础语法
【C++】C++入门
C语言是结构化和模块化的语言,适合处理小规模的程序,对于复杂的问题、规模较大的程序,需要高度的抽象和建模时,C语言则不合适,这时出现了面向对象的思想,支持面向对象的程序设计语言应运而生
s-little-monster
2024/06/25
3770
【C++】C++入门
C++入门知识(一)
一、#命名空间 在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的。 1.命名空间的定义 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
海盗船长
2020/08/27
3870
C屁屁(c++)万字入门
        C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的 程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机 界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言 应运而生。         1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一 种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而 产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的 程序设计,还可以进行面向对象的程序设计
比特大冒险
2023/04/16
6230
C屁屁(c++)万字入门
初识C++ · 入门(1)
C++与C语言是有一定交集的,可以理解为本贾尼在使用C语言的时候认为有缺陷,于是加了一些小语法进行改良,后来经过委员会的修改,C++98问世了,是第一部标准版本。
_lazy
2024/10/16
740
初识C++ · 入门(1)
从C语言过渡到C++
1979年,贝尔实验室Bjarne Stroustrup 在C语言的基础上,设计开发出了C++语言。C++语言是对C语言的扩充和完善,最初被命名为 “带类的C",1983年更名 “C++”。
秋邱
2024/10/09
1780
[C++]C++基础知识概述
  C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适,为了解决软件危机,20世纪80年代,计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。
IT编程爱好者
2023/04/12
1K0
[C++]C++基础知识概述
【C++入门篇】保姆级教程篇【上】
说到C++大家总会想到C语言,毕竟C++也就是C plus plus 么,没有错,C++在语法上是兼容C语言的。我们C++的祖师爷本贾尼·斯特劳斯特卢普在写C程序的时候对于C的一些语法规则感到不合适,于是祖师爷在C的基础上开发了这样一门语言。今天,我们就要开启C++世界的大门了。
用户11029129
2024/06/04
1840
【C++入门篇】保姆级教程篇【上】
【C++】C++基础语法
     当我们协同完成一个项目时,你定义的变量会不会与其他人定义的变量名冲突???
The sky
2023/04/12
1.5K0
【C++】C++基础语法
【C++入门】命名空间、缺省参数、函数重载
在正式进入C++之前,我们首先要对C++有一个基本的认知。这里我就不过多的进行描述了,有兴趣的可以去网络搜索一番。总而言之,从名称上面我们也可以看得出来,C++是在C的基础上进行不断地优化发展。事实上确实是这样,C语言中90%以上的语法在C++中都适用。
诺诺的包包
2023/02/20
7720
C语言和C++的区别是什么?8个点通俗易懂的告诉你
有些初学的同学傻傻分不清其中的区别,下面我将详细的讲解C语言和C++的区别点。帮助大家尽快的理解。
诸葛青云
2019/04/26
2.6K0
C语言和C++的区别是什么?8个点通俗易懂的告诉你
C++打怪升级(一)- 命名空间、缺省形参、重载
C++相比C语言(32个)引入了更多的(63个)关键字,这一点也可以管中窥豹看出一点C++的复杂。
怠惰的未禾
2023/04/27
9680
C++打怪升级(一)- 命名空间、缺省形参、重载
【C++阅览室】C++入门之过渡C语言
定义命名空间,需要使用到 namespace 关键字 ,后面跟 命名空间的名字 ,然 后接一对 {} 即可, {}
小文要打代码
2024/10/16
800
【C++阅览室】C++入门之过渡C语言
【c++入门】命名空间,缺省参数与函数重载
C++是一种与C语言紧密相关的编程语言。尽管它继承了C语言的许多特点,但C++引入了面向对象编程等概念,并增加了一些自己的特性和关键字来支持这些特性。比较C++和C语言的关键字,我们可以发现以下特征:
用户11029103
2024/03/24
3420
【c++入门】命名空间,缺省参数与函数重载
C++前期概念(重)
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
ljw695
2024/10/18
1300
C++前期概念(重)
C++入门篇1
C++是在C语言的基础上,又容纳了许多面向对象的编程思想,并增加了许多有用的库,以及编程范式,如果以及学习C语言后,对C++的学习也是很有帮助的。 C++补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用域方面,IO方面,函数方面,指针方面,宏方面
Yui_
2024/10/16
1020
C++入门篇1
推荐阅读
相关推荐
C++入门篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验