C++(入门1)

C++参考文档

Reference - C++ Reference

C++ 参考手册 - cppreference.com

cppreference.com

第一个C++程序

cpp 复制代码
#include<stdio.h>
int main() {
	printf("Hello C++\n");
	return 0;
}

由上述代码可知C++是兼容C语言

第一个C++标准程序

cpp 复制代码
#include<iostream>
using namespace std;
int main() {
	cout << "Helloc C++" << endl;
	return 0;
}

namespace命名空间

价值存在

在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名 冲突或名字污染,namespace关键字的出现就是针对这种问题的。 c语⾔项⽬类似下⾯程序这样的命名冲突是普遍存在的问题,C++引⼊namespace就是为了更好的解决 这样的问题

eg:我们知道rand是stdlib.h库中的一个函数,现在我们把他作为变量名。

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int rand = 10;
int main() {
	printf("%d",rand);
	return 0;
}

运行结果发现出现错误

这时我们用namespace,把该变量隔离就可以完美解决

namespaces定义

定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。

namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下 ⾯的rand不在冲突了。

C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。

namespace只能定义在全局,当然他还可以嵌套定义。

项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。

C++标准库都放在⼀个叫std(standard)的命名空间中。

但打印结果并不是我们想要的,也就是打印的rand打印的就是stdlib.h中的rand,我们换成打印地址。

验证结果就是一个地址,也就是存在stdlib.h中的地址

那么我们如何访问rand=10 10这个变量呢?

首先介绍一个操作符::

::域作用限定符

::默认去全局查找变量

std::默认去std域中去查找

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
namespace std {
	int rand = 10;
}
int main() {
	printf("%p\n",rand);
	printf("%d", std::rand);
	return 0;
}

完美解决。

namespace嵌套使用

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
namespace std {
	namespace a1 {

		int Add(int x, int y) {
			return x + y;
		}
	}
	namespace a2 {

		int Add(int x, int y) {
			return (x + y) * 10;
		}
	}
}
int main() {
	printf("%d\n", std::a1::Add(2,2));
	printf("%d\n", std::a2::Add(2,2));
	return 0;
}

运行结果

通过这个代码可以更让我们知道namespace存在的价值,假设在工作多人开发一个项目,写的函数相似,但函数返回值不同,那么就可可以用这种话隔离的方式,分别调用。

C++标准库都放在⼀个叫std(standard)的命名空间中。

命名空间使用

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

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

就是我们上述写的在每次使用加上 名字::变量

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

using lph::a

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

usinng展开直接使用:

不用using

用using

using namespace std:也就是把c++标准库中的函数全部展开。

C++输⼊&输出

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

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

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

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

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

• IO流涉及类和对象,运算符重载、继承等很多⾯向对象的知识,这些知识我们还没有讲解,后⾯我会有专⻔的⼀个章节来细节IO流库。

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

• ⼀般⽇常练习中我们可以using namespace std,实际项⽬开发中不建议using namespace std。 • 这⾥我们没有包含,也可以使⽤printf和scanf,在包含间接包含了。vs系列 编译器是这样的,其他编译器可能会报错。

缺省参数

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

如下如图所示10就是缺省值,第一个函数调用空参,使用缺省值,第二个函数调用,使用实参。

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
//确省参数
void Fun(int a=10) {

	cout << a << endl;
}
int main() {
	Fun();
	Fun(20);
	return 0;
}

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

半缺省:

cpp 复制代码
void Fun(int a, int b = 10, int c = 30) {
	cout << a << " " << b << " " << c << endl;
}
int main() {
	Fun(1);
	Fun(1, 2);
	Fun(1,2, 3);
	return 0;
}

全缺省:

cpp 复制代码
void Fun(int a=5, int b = 10, int c = 30) {
	cout << a << " " << b << " " << c << endl;
}
int main() {
	Fun();
	Fun(1);
	Fun(1, 2);
	Fun(1,2, 3);
	return 0;
}

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

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

函数重载

C++⽀持在同⼀作⽤域中出现同名函数 ,但是要求这些同名函数的形参不同(个数不同i或则类型不同)。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同 名函数的,不同类型返回值不构成函数重载。

eg:

参数类型不同

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
//参数类型不同
void Add(int a, int b) {
	cout << "Add(int a, int b)" << endl;
}
void Add(double a, double b) {
	cout << "Add(double a, double b)" << endl;
}
int main() {
	//整形
	Add(1,1);
	//double型
	Add(1.1,1.2);
	return 0;
}

参数个数不同,调用函数也不同

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
//参数类型不同
void Add() {
	cout << "Add()" << endl;
}
void Add(int a) {
	cout << "Add(int a)" << endl;
}
void Add(int a, int b) {
	cout << "Add(int a, int b)" << endl;
}
int main() {
	Add();
	Add(1);
	Add(1,2);
	return 0;
}

入门2:CSDN

相关推荐
蜀黍@猿23 分钟前
【C++ 基础】从C到C++有哪些变化
c++
Am心若依旧40924 分钟前
[c++11(二)]Lambda表达式和Function包装器及bind函数
开发语言·c++
明月看潮生26 分钟前
青少年编程与数学 02-004 Go语言Web编程 20课题、单元测试
开发语言·青少年编程·单元测试·编程与数学·goweb
zh路西法34 分钟前
【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(一):从电梯出发的状态模式State Pattern
c++·决策树·状态模式
大G哥36 分钟前
java提高正则处理效率
java·开发语言
VBA63371 小时前
VBA技术资料MF243:利用第三方软件复制PDF数据到EXCEL
开发语言
轩辰~1 小时前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
小_太_阳1 小时前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
向宇it1 小时前
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
开发语言·unity·c#·编辑器·游戏引擎
lxyzcm1 小时前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23