How do we learn C++ ? (2)

11 篇文章 3 订阅

1.首先要知道C++兼容C的语法,学习C对于C++的帮助很大

2.第一个C++代码

#include<iostream>
//类比C语言的头文件
using namespace std;

int main() {

	cout << "hello world!\n" << endl;

	return 0;
}

2.1关键字namespace(命名空间)具体含义:

命名空间是一个 ‘域’ 和C语言的作用域的域差不多,可以把一些变量或者函数包含在里面,主要用来解决C语言的一些命名缺陷(冲突)问题。

2.2

C语言中的定义不能是关键字,比如

int long = 0;

这个定义就是错误的,因为int和long都是C语言中的关键字。

2.3

但是库函数的名称就可以定义,比如这段代码就可以编译成功

int main() {
	int scanf = 10;
	int strlen = 20;
	return 0;
}

接着往下看这段代码,如果copy到VS上,就发现会报错的

int main() {
	int scanf = 10;
	int strlen = 20;

	scanf("%d", &scanf);

	printf("%d", scanf);
	printf("%d", strlen);

	return 0;
}


分析错误:命名冲突

int main() {
	int scanf = 10;
	int strlen = 20;
    
	//调库函数	取地址,使用上面的初始化
	scanf("%d", &scanf);
	//报错:项不会计算为接受 2 个参数的函数

	printf("%d", scanf);
	printf("%d", strlen);

	return 0;
}

因为就近原则,使用scanf的时候,不会去全局找,再因为局部优先的原因,会先到局部找,这个问题C解决不了。

回到C++

C++有命名空间可以用来解决这个问题

//命名空间,  名称
namespace    ABC  {
int scanf = 10;
int strlen = 20;
//内容
}

用‘域’把这两个包含了,不会和其它的冲突

使用方法:

 namespace ABC  {
	int scanf = 10;
	int strlen = 20;
}

int main()
{
	//默认访问局部或者全局
	printf("%x\n", scanf);
	printf("%x\n", strlen);

	//指定访问ABC命名空间的
	// :: 域作用限定符
	printf("%x\n", ABC::scanf);
	printf("%x\n",ABC::strlen );

	return 0;
}

还可以定义函数:

namespace adc {
	int add(int left, int right){
		return left + right;
	}
}
int main() {
	adc::add(1, 2);
	return 0;
}

使用方法2:嵌套命名空间,使用的较少,但是很有意义

namespace adc {
	//函数1
	int add(int left, int right){
		return left + right;
	}
	//嵌套的函数2
	namespace acd {
		int sub(int left, int right) {
			return left - right;
		}
	}
}
int main() {
	adc::add(1, 2);
	adc::acd::sub(12, 2);
	//格式也不一样
	return 0;
}

命名空间在一个工程里面可以定义多个

名字为NO.1的头文件

 可以在cpp文件调用

总结:同一个工程中在不同的文件中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中 

3:

C++为了防止命名冲突,把自身库里面的东西都定义在一个名为std(标准库)的空间中

要使用标准库中的东西有三种方法:

3.1. 指定命名空间

较为麻烦,每个使用的地方都要指定,但是最规范

#include<iostream>

int main() {

	std::cout << "hello world" << std::endl;

	return 0;
}

3.2.懒人必备法

直接展开std,整个文件都可用,但是会使自己定义的和库定义的冲突了,变得和C一样了

在工程中不推荐,自行练习无所谓

#include<iostream>

using namespace std;

int main() {

	cout << "hello world" << endl;

}

3.3.对部分常用的展开,一种1和2折中的方案,也会经常用

#include<iostream>
using std::cout;
using std::endl;

int main() {

	cout << "hello world" << endl;

	return 0;
}

4.C++的输入和输出

  先不深入了解,往后会讲,先记住它的使用
 cout——是ostream输出类型全局对象
 cin——是istream输入类型的全局对象
 endl——是一个全局的换行符号

int main() {

    //1——控制台
	//2——输入
	//3——不是必须的

	//   1          2                 3
	std::cout << "hello world" << std::endl;
	//	 1.	↑	2.借助<< 流向↓ 
	//		↑	←	←   ←	↓

	return 0;
}

4.1对比C语言的scanf和printf的区别是—— 自动识别类型

	
int main() {
	int a = 10;
	int* P = &a;

	//C
	printf("%d,%p\n", a, P);

	//C++
	std::cout << a << "," << P << std::endl;
    

    //相当于scanf
	//从控制台输入,流向a
	std::cin >> a;
	printf("%d,%p\n", a, P);

	return 0;
}

原理涉及到函数重载和运算符重载,后面会讲

5.缺省参数:

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

#include<iostream>

using namespace std;

//   函数          参数
void lostnumber(int a = 0) {
	cout << a << endl;
}

int main() {

	lostnumber(20);
	lostnumber(10);
	lostnumber(0);//默认

	return 0;
}

5.1全缺省参数 :参数全部给有缺省值

缺省又叫做 :初始值,参数值,缺省值

	
	//全缺省参数
	//					缺省值
	void lostnumber1(int a = 10, int b = 20, int c = 30) {

		cout << a << endl;
		cout << b << endl;
		cout << c << endl << endl;

	}
	int main() {

		lostnumber1();//没传
		//结果为初始值10,20,30
		lostnumber1(1);//传1个
		//结果1,20,30
		lostnumber1(1, 2);//传2个
		//结果1,2,30
		lostnumber1(1, 2, 3);//全传
		//结果1,2,3
		return 0;
	}

5.2 半缺省参数

必须从右往左缺省,并且是连续的

	//半缺省参数
	void lostnumber2(int a, int b = 10, int c = 20) {

		cout << a << endl;
		cout << b << endl;
		cout << c << endl << endl;

	}

	int main() {
		//不能不传参数,最少为1
		lostnumber2(1);
		//1,10,20
		lostnumber2(1, 2);
		//1,2,10
		lostnumber2(1, 2, 3);
		//1,2,3
		return 0;
	}

作用 :调用变得更灵活,以后会细讲,先不纠结

注意事项:缺省参数必须是常量,(变量的情况有些复杂,不纠结)

缺省参数不能在函数声明和定义同时出现(.h 和.cpp)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值