当前位置: 首页 > news >正文

C++的基础语法篇一

本篇博客正式进入C++语言的学习,C++是兼容C语言的,也是弥补了C语言的一些不足,同时也是向更高难度语言方面的学习。

C++发展历史

C++的起源可以追溯到1979年,当时Bjarne Stroustrup(本贾尼·斯特劳斯特卢普,这个翻译的名字不同的地方可能有差异)在贝尔实验室从事计算机科学和软件工程的研究⼯作。面对项目中复杂的软件开发任务,特别是模拟和操作系统的开发工作,他感受到了现有语言(如C语言)在表达能力、可维护性和可扩展性方面的不足。1983年,Bjarne Stroustrup在C语⾔的基础上添加了面向对象编程的特性,设计出了C++语⾔的雏形,此时的C++已经有了类、封装、继承等核心概念,为后来的⾯向对象编程奠定了基础。这⼀年该语⾔被正式命名为C++。在随后的⼏年中,C++在学术界和⼯业界的应⽤逐渐增多。⼀些⼤学和研究所开始C++作为教学和研究的⾸选语⾔,⽽⼀些公司也开始在产品开发中尝试使⽤C++。这⼀时期,C++的标准库和模板等特性也得到了进⼀步的完善和发展。C++的标准化⼯作于1989年开始,并成⽴了⼀个ANSI和ISO(International StandardsOrganization)国际标准化组织的联合标准化委员会。1994年标准化委员会提出了第⼀个标准化草案。在该草案中,委员会在保持斯特劳斯特卢普最初定义的所有特征的同时,还增加了部分新特征。在完成C++标准化的第⼀个草案后不久,STL(Standard Template Library)是惠普实验室开发的⼀系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室⼯作时所开发出来的。在通过了标准化第⼀个草案之后,联合标准化委员会投票并通过了将STL包含到C++标准中的提议。STL对C++的扩展超出C++的最初定义范围。虽然在标准中增加STL是个很重要的决定,但也因此延缓了C++标准化的进程。1997年11⽉14⽇,联合标准化委员会通过了该标准的最终草案。1998年,C++的ANSI/IS0标准被投⼊使⽤。

命名空间

namespace的定义
• 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
• namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。
• C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。
• namespace只能定义在全局,当然他还可以嵌套定义。
• 项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。
• C++标准库都放在⼀个叫std(standard)的命名空间中。

这个命名空间具体是什么呢?
你可以把C/C++的头文件想像为一份地图,或者是一份导航系统,通过这个导航系统去回家,但是你进家你是不是需要一份钥匙啊,然后把这个命名空间想象为你的家,你要访问这个家中的,你要用这个家里的厨具(变量),是不是要进入家里啊。

命名空间代码演示

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>//c++头文件
namespace zph
{int a=0;
}
int main()
{//printf("%d", a);这样写是错误的printf("%d", zph::a);//这样才是对的
}

为啥这样写? ok,来看,命名空间是你家(也叫做域),你不允许别人访问,是不是要加括号;要用家里的东西是不是要进入家里之前拿到钥匙,双冒号叫做域解析运算符,你可以理解通过这个才可以把钥匙放在门上或者拿在手中,每个人的家中都是有门的,你不可能说,哎呀,我家是住桥洞的没门,那很危险了同志。有门就有锁和钥匙。
当然你家不可能只有一个房间,可以这样想一个域是一个家,家中再有房间的话,就在域中添加域叫域的嵌套,家中家的效果。那假如说,哎呀,域有什么用啊,我告诉你不同域中的相同名字变量可以同时访问呢,在c语言中变量是不是不能重名啊,但是在c++中的域中变量是可以重名的,而且可以同时访问。
在这里插入图片描述
那又有人问了,假如我不想访问域变量,就想访问main函数之外的全局变量呢,很简单把冒号左边的域名去掉就行。注意同一个文件下不允许相同的域名出现,但是不同文件下可以出现同名文件。多⽂件中可以定义同名namespace,他们会默认合并到⼀起,就像同⼀个namespace⼀样。

命名空间使用

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。所以下⾯程序会编译报错。所以我们要使⽤命名空间中定义的变量/函数有三种⽅式:

• 指定命名空间访问,项⽬中推荐这种⽅式。

• using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。

• 展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤。

#include<stdio.h>
namespace zph
{
int a = 0;
int b = 1;
}
int main()
{
// 编译报错:error C2065: “a”: 未声明的标识符
printf("%d\n", a);
return 0;
}
// 指定命名空间访问
int main()
{
printf("%d\n", zph::a);
return 0;
}
// using将命名空间中某个成员展开
using zph::b;
int main()
{
printf("%d\n", zph::a);
printf("%d\n", b);
return 0;
}

C++输⼊&输出

• 是 Input Output Stream 的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输出对象。

• std::cin 是 istream 类的对象,它主要⾯向窄字符(narrow characters (of type char))的标准输⼊流。

• std::cout 是 ostream 类的对象,它主要⾯向窄字符的标准输出流。

• std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。

• <<是流插⼊运算符,>>是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)

• 使⽤C++输⼊输出更⽅便,不需要像printf/scanf输⼊输出时那样,需要⼿动指定格式,C++的输⼊输出可以⾃动识别变量类型(本质是通过函数重载实现的,这个以后会讲到),其实最重要的是C++的流能更好的⽀持⾃定义类型对象的输⼊输出。

• IO流涉及类和对象,运算符重载、继承等很多⾯向对象的知识,这些知识我们还没有讲解,所以这⾥我们只能简单认识⼀下C++ IO流的⽤法,后⾯我们会有专⻔的⼀个章节来细节IO流库。

• cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要通过命名空间的使⽤⽅式去⽤他们。

• ⼀般⽇常练习中我们可以using namespace std,实际项⽬开发中不建议using namespace std。

• 这⾥我们没有包含<stdio.h>,也可以使⽤printf和scanf,在包含间接包含了。vs系列编译器是这样的,其他编译器可能会报错

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
int main()
{
int a = 0;
double b = 0.1;
char c = 'x';cout << a << " " << b << " " << c << endl;
std::cout << a << " " << b << " " << c << std::endl;
//注意endl是回车换行
scanf("%d%lf", &a, &b);
printf("%d %lf\n", a, b);
// 可以⾃动识别变量的类型
cin >> a;
cin >> b >> c;
cout << a << endl;
cout << b << " " << c << endl;
return 0;
}
// 在io需求⽐较⾼的地⽅,如部分⼤量输⼊的竞赛题中,加上以下3⾏代码
// 可以提⾼C++IO效率
#include<iostream>
using namespace std;
int main()
{ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
return 0;
}

缺省参数

• 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。(有些地方把缺省参数也叫默认参数)

• 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。

• 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。

• 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。

#include <iostream>
using namespace std;
void Func(int a = 0)
{
cout << a << endl;
}
int main()
{
Func(); // 没有传参时,使⽤参数的默认值
Func(10); // 传参时,使⽤指定的实参
return 0;
}
#include <iostream>
using namespace std;
// 全缺省
void Func1(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
// 半缺省
void Func2(int a, int b = 10, int c = 20)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
Func1();
Func1(1);
Func1(1,2);
Func1(1,2,3);
Func2(100);
Func2(100, 200);
Func2(100, 200, 300);
return 0;
}

注意:缺省参数不能在函数声明和定义同时给!

函数重载

C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同名函数的。

#include<iostream>
using namespace std;
// 1、参数类型不同
int Add(int left, int right)
{return left + right;
}
double Add(double left, double right)
{return left + right;
}
// 2、参数个数不同
void Func()
{
cout << "f()" << endl;
}
void Func(int a)
{
cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
void Func(int a, char b)
{
cout << "f(int a,char b)" << endl;
}
void Func(char b, int a)
{
cout << "f(char b, int a)" << endl;
}// 返回值不同不能作为重载条件,因为调⽤时也⽆法区分
//void fxx()
//{}
//
//int fxx()
//{
// return 0;
//}// 下⾯两个函数构成重载
// f()但是调⽤时,会报错,存在歧义,编译器不知道调⽤谁
void f1()
{
cout << "f()" << endl;
}
void f1(int a = 10)
{
cout << "f(int a)" << endl;
}int main()
{
Add(10, 20);
Add(10.1, 20.2);
Func();
Func(10);
Func(10, 'a');
Func('a', 10);
return 0
http://www.dtcms.com/a/590579.html

相关文章:

  • 苏州网站推广如何使用aspx做电影网站
  • 视差设计网站深圳移动网站建设
  • 上贵州省建设厅的网站哪里网站建设专业
  • 网站建设电话营销培训ppt课件百度门店推广
  • 网站推广码怎么做深圳响应式网站设计
  • 老鹰主机安装Wordpress襄阳seo技术
  • 泰安市人才信息网南通百度seo代理
  • 做网站的人属于什么行业信息网站模板
  • GIS相关知识
  • 临安农家乐做网站WordPress图片类源码
  • 温州微网站制作公司哪家好网站建设手稿
  • 免费的网站推广渠道做wordpress 下载站
  • 狼们求个没封的免费网站网站百度排名提升
  • 福州优秀网站建设公司上海跨境电商网站开发公司排名
  • 【LLM】SmolLM3模型训练手册
  • 网站开发公司不干了浙江省一建建设集团网站
  • MVVM模型
  • 常用命令记录
  • 了解网站建设的基本流程最实用的上网网址一览表
  • 平台建站建设平谷营销型网站建设
  • 介绍好的免费网站模板下载地址管理咨询师报考条件2022年
  • 网站建设合同模板下载西宁百度seo
  • 深度学习:为什么不能将多层神经网络参数全部初始化为零以及如何进行随机初始化
  • 手机网站开发应注意保定网站建设方案优化
  • 第五次作业
  • 配送系统网站怎么做wordpress网页设计步骤
  • 云南机场建设集团网站网络地区广告代理
  • 网站建设公司找哪家百度搜索引擎推广收费标准
  • wordpress js验证码插件宁波seo外包方案
  • 哈尔滨网站制作专业网站建设的市场