【C++初阶】C++入门(1)

这篇具有很好参考价值的文章主要介绍了【C++初阶】C++入门(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C++初阶】C++入门(1),C++,c++,开发语言
🔥博客主页 小羊失眠啦.
🎥系列专栏《C语言》 《数据结构》 《Linux》《Cpolar》
❤️感谢大家点赞👍收藏⭐评论✍️


【C++初阶】C++入门(1),C++,c++,开发语言

一、C++的认识

1.1 什么是C++

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。 1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一 种新的程序语言。命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计

1.2 C++的发展

1979年,贝尔实验室的本贾尼等人试图分析 unix 内核的时候,试图将内核模块化,于是在C 语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为C with classes。

C++的历史版本:

阶段 内容
C with classes 类及派生类、公有和私有成员、类的构造和析构、友元、内联函数、赋值运算符
重载等
C++ 1.0 添加虚函数概念,函数和运算符重载,引用、常量等
C++ 2.0 更加完善支持面向对象,新增保护成员、多重继承、对象的初始化、抽象类、静
态成员以及const成员函数
C++ 3.0 进一步完善,引入模板,解决多重继承产生的二义性问题和相应构造和析构的处
C++98 C++标准第一个版本,绝大多数编译器都支持,得到了国际标准化组织(ISO)和美
国标准化协会认可,以模板方式重写C++标准库,引入了STL(标准模板库)
C++03 C++标准第二个版本,语言特性无大改变,主要:修订错误、减少多异性
C++05 C++标准委员会发布了一份计数报告(Technical Report,TR1),正式更名
C++0x,即:计划在本世纪第一个10年的某个时间发布
C++11 增加了许多特性,使得C++更像一种新语言,比如:正则表达式、基于范围for循
环、auto关键字、新容器、列表初始化、标准线程库等
C++14 对C++11的扩展,主要是修复C++11中漏洞以及改进,比如:泛型的lambda表
达式,auto的返回值类型推导,二进制字面常量等
C++17 在C++11上做了一些小幅改进,增加了19个新特性,比如:static_assert()的文
本信息可选,Fold表达式用于可变的模板,if和switch语句中的初始化器等
C++20 自C++11以来最大的发行版,引入了许多新的特性,比如:**模块(Modules)、协程(Coroutines)、范围(Ranges)、概念(Constraints)**等重大特性,还有对已有
特性的更新:比如Lambda支持模板、范围for支持初始化等
C++23 制定ing

二、C++关键字

C++一共有63个关键字,其中有32个是C语言中的关键字

asm do if return try continue
auto double inline short typedef for
bool dynamic_cast int signed typeid public
break else long sizeof typename throw
case enum mutable static union wchar_t
catch explicit namespace static_cast unsigned default
char export new struct using friend
class extern operator switch virtual register
const false private template void true
const_cast float protected this volatile while
delete goto reinterpret_cast

三、命名空间

3.1 为什么有命名空间

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染。

例如:

#include<stdio.h>
#include<stdlib.h>

int rand = 10;

int main()
{
	printf("%d", rand);
	return 0;
}

【C++初阶】C++入门(1),C++,c++,开发语言

在这段程序中,不引用头文件#include <stdlib.h>是可以正常运行的,但引用后程序就会报错,这是什么原因呢?因为 rand<stdlib.h> 中已有了定义,这里报了重定义的错误。

命名空间分割了全局命名空间,其中每一个命名空间是一个作用域。域是一种空间概念,常见的域有:局部域、全局域、类域、命名空间域,域会影响访问和生命周期。

3.2 命名空间的定义

命名空间的定义由两部分构成:首先是关键字namespace,后面跟命名空间的名字,然后接一对花括号,花括号中即为命名空间的成员。 命名空间中可以定义变量、函数、类型和其他命名空间。

namespace N1//命名空间的名字
{
	//定义变量
	int rand = 10;

	//定义函数
	int Add(int left, int right)
	{
		return left + right;
	}

	//定义类型
	struct Node
	{
		struct Node* next;
		int val;
	};

	//嵌套命名空间
	namespace N2
	{
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}

注意:

  • 一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
  • 用一个工程中允许出现多个相同名称的命名空间,编译器最后会将它们合并为一个命名空间

3.3 命名空间使用

命名空间的使用三种方式:

  • 加命名空间名称及域作用限定符
namespace N
{
	int a = 10;
	int b = 5;
}

int main()
{
	printf("%d\n", N::a);
	return 0;
}
  • 使用using将命名空间中某个成员引入
using N::b;
int main()
{
	printf("%d\n", N::a);
	printf("%d\n", b);
	return 0;
}
  • 使用using namespace命名空间名称引入(展开命名空间)
namespace N
{
	int a = 10;
	int b = 5;
}

int a = 20;

using namespace N;

int main()
{
	printf("%d\n", a);      //a不明确,有二义性
	printf("%d\n", ::a);    //访问全局的a
	printf("%d\n", N::a);   //访问N中的a
	printf("%d\n", b);
	return 0;
}

N中的成员a 就与全局作用域中的a 产生了冲突。这种冲突是允许存在的,但是**要想使用冲突的名字,我们就必须明确指出名字的版本。**main函数中所有未加限定的a都会产生二义性错误。

这时我们必须使用**域作用限定符(:😃**来明确指出所需的版本

  • : :a来表示全局作用域中的a
  • N: :a来表示定义在N中的a

注意:

如果命名空间没有展开,编译器默认是不会搜索命名空间中的变量,去访问变量是访问不到的。

访问的优先级:局部域 > 全局域

3.4 命名空间的嵌套

嵌套的命名空间同时是一个嵌套的作用域,它嵌套在外层命名空间的作用域中。嵌套的命名空间中的名字遵循的规则与往常类似:内层命名空间声明的名字将隐藏外层命名空间声明的同名成员。在嵌套的命名空间中定义的名字只在内层命名空间中有效,外层命名空间的代码想要访问它必须在名字前添加限定符。

namespace N
{
	int a = 10;

	namespace N1
	{
		int a = 20;
		int b = 15;
	}

	namespace N2
	{
		int c = N1::b;
	}
}

int main()
{
	printf("%d\n", N::N2::c);
	printf("%d\n", N::N1::a);
	printf("%d\n", N::a);
	return 0;
}

3.5 std命名空间的使用

std是C++标准库的命名空间,如何展开std使用更合理呢?

  1. 在日常练习中,建议直接using namespace std;即可,这样就很方便。
  2. using namespace std;展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型、对象、函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模 大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间例如:using std::cout展开常用的库对象、类型等方式。

四、C++输入和输出

#include<iostream>
using namespace std;

int main()
{
	int a = 0;
	double b = 0;
	cin >> a >> b;//流提取运算法
	cout << a << " " << b << endl;//流插入运算法 endl相当于换行
	cout << a << " " << b << '\n';
	return 0;
}

我们在项目中要经常使用 coutendl,每次指定命名空间很不方便,直接展开会全部暴露,有冲突风险,我们可以指定展开来解决问题。

using std::cout;
using std::endl;

说明

  • 使用**cout标准输出对象(控制台)和cin标准输入对象(键盘)**时,必须包含< iostream >头文件以及按命名空间使用方法使用std。
  • coutcin 是全局的流对象,endl 是特殊的C++符号,表示换行输出,他们都包含在包含 < iostream >头文件中。
  • <<是流插入运算符,>>是流提取运算符。
  • 使用C++输入输出更方便,不需要像 printf和scanf 输入输出时那样,需要手动控制格式。 C++的输入输出可以自动识别变量类型

五、缺省参数

5.1 缺省参数的定义

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

#include<iostream>
using namespace std;

void Test(int a = 0)
{
	cout << a << endl;
}

int main()
{
	Test();//没有传参时,使用参数的默认值a=0
	Test(1);//传参时,使用指定的实参a=1
}

5.2 缺省参数分类

  • 全缺省参数(全默认参数)–所有参数都给了缺省值
void Test(int a = 10, int b = 20, int c = 30)
{
	cout << "a = " << a ;
	cout << " b = " << b ;
	cout << " c = " << c << endl;
}

int main()
{
	Test(1, 2, 3);
	Test(1, 2);
	Test(1);
	Test();
	return 0;
}

【C++初阶】C++入门(1),C++,c++,开发语言

全缺省参数在传参时,参数是按照从左往右的顺序进行缺省的,不能跳着缺省,例如:Func(1, ,3) ,让第一个形参和第三个形参都使用传递值,而让第二个参数使用缺省值,这种做法是不被允许的。

  • 半缺省参数 – 部分的参数给了缺省值
void Test(int a , int b = 20, int c = 30)
{
	cout << "a = " << a ;
	cout << " b = " << b ;
	cout << " c = " << c << endl;
}

int main()
{
	Test(1, 2, 3);
	Test(1, 2);
	Test(1);
	return 0;
}

注意:

  • 缺省参数不能在函数声明和定义中同时出现(最好在声明给;声明给,定义给也不可以)
  • 缺省值必须是常量或者全局变量。
  • 半缺省参数必须从左到右依次来给出,不能间隔着给
  • C语言不支持

【C++初阶】C++入门(1),C++,c++,开发语言文章来源地址https://www.toymoban.com/news/detail-817817.html

到了这里,关于【C++初阶】C++入门(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++初阶之C++入门最全详解

    C++总计63个,C语言32个 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,namespace的出现

    2024年02月16日
    浏览(34)
  • C++初阶 入门(2)

    目录 一、缺省函数 1.1什么是缺省函数 1.2为什么要有缺省函数 1.3使用缺省函数 1.4测试代码 二、函数重载 2.1什么是函数重载  2.2为什么要有函数重载 2.3什么情况构成函数重载 2.4函数重载例子及代码  三、引用 3.1什么是引用 3.2如何引用 ​3.3常引用(可略过) 3.4引用和指针的对

    2024年02月08日
    浏览(26)
  • 【初阶C++】入门(超详解)

    C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C++学习有一定的帮助,本章节主要目标: 补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用域方面、IO方面、函数方面、指

    2024年02月04日
    浏览(31)
  • C++初阶 入门

      目录 1.用C++的方式写一个Hello World 2.命名空间 2.1什么是命名空间? 2.2使用命名空间 3.C++的输入输出  前言:C++初阶系列,每一期博主都会使用简单朴素的语言将对应的知识分享给大家,争取让所有人都可以听懂,C++初阶系列会持续更新,上学期间将不定时更新,但总会更的

    2024年02月07日
    浏览(30)
  • C++初阶--C++入门

    从本章开始,我们就要正式的进入到C++的学习了。C++是在C的基础之上,容纳进去了 面向对象编程 思想,并增加了许多有用的库,以及编程范式等,同时 对C语言某些设计不合理的地方进行优化,如在作用域,IO,函数,指针以及宏方面 。下面我们先从一些较容易理解的知识

    2024年02月15日
    浏览(25)
  • 【C++初阶】C++入门——缺省参数、函数重载

     缺省参数是 声明或定义函数时为函数的参数指定一个缺省值 。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。  上面代码在 fun 函数的形参部分给了缺省值10,这意味着在调用 fun 函数的时候可以传参,也可以不传参,如果传参了那形参

    2024年02月11日
    浏览(29)
  • 【C++初阶】---C++入门篇

    👧个人主页:@小沈YO. 😚小编介绍:欢迎来到我的乱七八糟小星球🌝 📋专栏:C++ 心愿便利店 🔑本章内容:命名空间、缺省参数 记得 评论📝 +点赞👍 +收藏😽 +关注💞哦~ C语言最初由 Dennis Ritchie 于 1969 年到 1973 年在 ATT 贝尔实验室里开发出来,主要用于重新实现 Unix 操作

    2024年02月16日
    浏览(25)
  • 【C++初阶】第一站:C++入门基础(中)

    前言: 这篇文章是c++入门基础的第一站的中篇,涉及的知识点 函数重载 : 函数重载的原理--名字修饰 引用:概念、特性、使用场景、常引用、传值、传引用效率比较的知识点 目录 5. 函数重载 (续) C++支持函数重载的原理--名字修饰(name Mangling) 为什么C++支持函数重载,而C语言

    2024年02月05日
    浏览(32)
  • 【C++初阶】第一站:C++入门基础(下)

    前言:  紧接着上两篇文章,c++入门基础(上):C++入门基础(上)                                  c++入门基础(中):C++入门基础(中)         继续补充完c++初阶入门基础的知识点,本章知识点包括:         引用和指针的区别、内联函数、auto(C++11)、基于范围

    2024年02月04日
    浏览(32)
  • 【C++初阶】C++入门——C++介绍、命名空间、输入输出

     C语言是 结构化 和 模块化 的语言,适合处理 较小规模 的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出了 OOP (object oriented programming: 面向对象 )思想,支持面向对象的程序设计语言应

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包