【哇! C++】第一个C++语言程序

news/2025/2/11 8:35:21/

目录

​编辑

第一个C++语言程序

一、命名空间

1.1 C++为什么会有命名空间

1.2 命名空间域 

二、命名空间的使用

2.1 展开命名空间和using声明

2.2 展开命名空间的意义

2.3 命名空间的使用

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

2.3.2 命名空间中还可以再继续定义命名空间

三、记忆式理解C++的输入与输出

3.1 "<<"在C++中的两种意思

3.2 ">>"在C++中的两种意思


 第一个C++语言程序

        C++是在C的基础上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等,补充了C语言语法的不足。

        C++兼容C

#include<iostream>
using namespace std;int main()
{cout << "hello world" << endl;return 0;
}

一、命名空间

        定义命名空间,需要使用namespace关键字,后面跟命名空间的名字,然后接一对{}即可。

1.1 C++为什么会有命名空间

        有一个语法问题,是C语言解决不好的,例如:

#include<stdio.h>
//#include<stdlib.h>int rand = 10;int main()
{printf("hello world\n");printf("%d\n", rand);return 0;
}

        上述程序虽然通过了,但是有一个问题,如果把#include<stdlib.h>这句代码放开,程序就报错了,报错显示rand重定义了。

        这是因为,C语言中,全局变量可能存在命名冲突的问题。当包含了stdlib头文件以后,头文件展开,其中会有一个全局函数rand。而下边的程序中又定义了rand全局变量。C语言区分不开,于是就造成了命名冲突问题。

        C++增加了解决方式,我们知道不同的域里可以定义同名变量。例如:

#include<stdio.h>int x = 0;int main()
{int x = 1;printf("hello world\n");printf("%d\n", x);printf("%d\n", ::x);return 0;
}

1.2 命名空间域 

        ::表示域作用限定符,::左边什么都没给,默认为全局域。

域包括:

        全局域局部域命名空间域类域

        基于上述结论,我们通过程序对命名空间域做进一步了解:命名空间也可定义函数和定义结构体。

#include<stdio.h>
#include<stdlib.h>namespace exp1
{int x = 0;int rand = 0;//定义函数int Add(int left, int right){return left + right;}//定义结构体struct Node{struct Node* next;int val;}
}
namespace exp2
{int x = 1;
}int main()
{printf("%d\n", exp1::x);//         0printf("%d\n", exp2::x);//         1printf("%p\n", rand);   //         7A36F070printf("%d\n", exp1::rand);//      0printf("%d\n", exp1::Add(1, 2));// 3struct exp1::Node phead;return 0;
}

编译器的搜索原则:

  1.         不指定域:1.先去局部域;2.再去全局域
  2.         指定域:如果指定搜索域,则直接去指定域搜索。

二、命名空间的使用

2.1 展开命名空间和using声明

using namespace std;

        指的是,之前被圈在命名空间中的未经指定命名空间指令访问的语句,通过using声明主动放到全局,使搜索的时候不需要特别指定完整的命名空间前缀,就可以被搜索到。

2.2 展开命名空间的意义

#include<iostream>
using namespace std;

        #include - 将头文件的内容插入到该命令所在的位置,从而把头文件和当前源文件连接成一个源文件,这与复制粘贴的效果相同。

        iostream - io相关的流的头文件

         如果此处只有#include<iostream>,而命名空间std没有展开,即使包了上一行头文件,也用不了。因为cont、endl在iostream命名空间中还被std封起来了。

        值得注意的是:std是所有C++库的命名空间。C++库中的头文件几乎是不带.h的。

#include<iostream>
using namespace std;int main()
{std::cout << ""hello world" << endl;cout << ""hello world" << endl;return 0;
}

         命名空间域打开以后,相当于全局域,搜索顺序还是先局部域,再全局域。但命名空间域展开后还是有弊端的,如果命名有冲突就会失去作用。

2.3 命名空间的使用

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

#include<iostream>int main()
{int i = 0;std::cin >> i;std::cout << xxxxx << std::endl;std::cout << xxxxx << std::endl;std::cout << xxxxx << std::endl;std::cout << xxxxx << std::endl;return 0;
}

        都要加std::会显得很麻烦,可采用使用using将命名空间中某个成员引入,将上述程序改写为:

#include<iostream>
using std :: cout;
using std :: endl;int main()
{int i = 0;std :: cin >> i;cout << "xxxxxx" << endl;cout << "xxxxxx" << endl;cout << "xxxxxx" << endl;cout << "xxxxxx" << endl;return 0;
}

2.3.2 命名空间中还可以再继续定义命名空间

        为避免展开命名空间导致的命名冲突,命名空间中还可以再继续定义命名空间。

#include<iostream>
using std::cout;
using std::endl;namespace exp
{namespace zs{void Push(){cout << "zs" << endl;}}namespace ls{void Push(){cout << "ls" << endl;}}
}
int main()
{int i = 0;std::cin >> i;cout << "xxxxx" << endl;cout << "xxxxx" << endl;cout << "xxxxx" << endl;cout << "xxxxx" << endl;exp::zs::Push();exp::ls::Push();return 0;
}

展开头文件和展开命名空间的区别:

        展开头文件:在编译的预处理阶段,编译器会把所有包含的头文件进行展开,把头文件中的内容拷贝过来,放在这里,编译器只会对.c和.cpp的文件编译,不会对.h文件进行编译,因为所有的.h定义的或声明的都是给其他地方用的。

        展开命名空间:影响的是域的搜索规则,默认情况下,编译器只会在局部和全局域中搜索。

        使用命名空间,可以做到3种搜索:指定搜索(加命名空间名称及作用域限定符,如std::cout公开搜索(使用using namespace 命名空间名称,如using namespace std)公开某些内容搜索(使用using将命名空间中某个成员引入​​​​​​​,如using std :: cout。 

三、记忆式理解C++的输入与输出

3.1 "<<"在C++中的两种意思

        1. 左移;

int i = 1;
i = i << 1;

        2. 流插入运算符。

        与cout配合,cout标准输出对象(控制台)。与C语言不同C++可以自动识别类型。此外,也可以连续的流向cout中去。

cout:

  • c      -      代表控制台的缩写console
  • cout -      把数据out到控制台中去
  • cout << "hello world" - 字符串流向cout中去
cout << "hello world" << endl;
const char* str = "hello world";
char ch = '\n';
cout << str << i << "hello world" << ch;//比起C语言printf又有另一个特征
//C语言要指定对应的格式类型
peintf("%d %s %p\n", i, str, pi);

        C++中的换行可用endl(endline)endl是全局变量,在某种程度上是等价于'\n'的。

3.2 ">>"在C++中的两种意思

        1. 右移;

        2. 流提取运算符。

        与cin配合,cin标准输入对象(键盘)。即,在控制台里边,用键盘输入了一串字符,可以把该字符串提取到变量中。此外,同样可以提取一个,也可以连续的提取。

const char* str = "hello world";
cin >> i >> ch;
cout << str << i << ch;//相较于scanf
scanf("%d%c", &i, &ch);
printf("%d%c", &i, &ch);


http://www.ppmy.cn/news/1571114.html

相关文章

论文阅读:MGMAE : Motion Guided Masking for Video Masked Autoencoding

MGMAE:Motion Guided Masking for Video Masked Autoencoding Abstract 掩蔽自编码&#xff08;Masked Autoencoding&#xff09;在自监督视频表示学习中展现了出色的表现。时间冗余导致了VideoMAE中高掩蔽比率和定制的掩蔽策略。本文旨在通过引入运动引导掩蔽策略&#xff0…

golang使用sqlite3,开启wal模式,并发读写

因为sqlite是基于文件的&#xff0c;所以默认情况下&#xff0c;sqlite是不支持并发读写的&#xff0c;即写操作会阻塞其他操作&#xff0c;同时sqlite也很容易就产生死锁。 但是作为一个使用广泛的离线数据库&#xff0c;从sqlite3.7.0版本开始&#xff08;SQLite Release 3.…

方舟字节码原理剖析:架构、特性与实践应用

方舟字节码原理剖析&#xff1a;架构、特性与实践应用 一、引言 在当今软件行业高速发展的大背景下&#xff0c;应用程序的性能、开发效率以及跨平台兼容性成为了开发者们关注的核心要素。编译器作为软件开发流程中的关键工具&#xff0c;其性能和特性直接影响着软件的质量和…

DeePseek结合PS!批量处理图片的方法教程

​ ​ 今天我们来聊聊如何利用deepseek和Photoshop&#xff08;PS&#xff09;实现图片的批量处理。 传统上&#xff0c;批量修改图片尺寸、分辨率等任务往往需要编写脚本或手动处理&#xff0c;而现在有了AI的辅助&#xff0c;我们可以轻松生成PS脚本&#xff0c;实现自动化处…

51单片机俄罗斯方块开机显示界面

/************************************************************************************************************** * 名称&#xff1a;Data_Cover * 功能&#xff1a;整屏写入 * 参数&#xff1a;array&#xff0c;为开机显示界面数据 * 返回&#xff1a;NULL * 备注&…

基于 Git、Jenkins 和 Docker 的自动化持续集成与部署实践

摘要&#xff1a; 在现代软件开发中&#xff0c;持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;已成为提升开发效率和软件质量的关键实践。通过将 Git、Jenkins 和 Docker 三者结合&#xff0c;可以构建一个高效的自动化构建、测试和部署流水线。 …

Enterprise Architect 17 全面升级:重塑建模体验,赋能复杂系统设计

在数字化转型的浪潮中&#xff0c;复杂系统设计已成为企业创新和发展的重要推动力。作为一款广受认可的建模工具&#xff0c;Sparx Systems 的 Enterprise Architect&#xff08;EA&#xff09;以其丰富的功能和灵活性&#xff0c;赢得了全球用户的信赖。近日&#xff0c;Sparx…

【Unity】性能优化:UI的合批 图集和优化

目录 前言一、合批测试二、图集 前言 注意&#xff1a;DC指的是Draw Call。 温馨小提示&#xff1a;Frame Debugger 窗口&#xff08;菜单&#xff1a;Window > Analysis > Frame Debugger&#xff09;会显示绘制调用信息&#xff0c;并允许您控制正在构建的帧的“回放”…