C++基础知识详解

C++基础知识

C++的出现是为了补充C语言存在的一些不足,由此我们在C++中需要学习一些新的特性。

1.命名空间

1.域作用限定符 ::(C++中才有的)
样例(注意域作用符 ::使用时,前面有一个空格)

int a = 0;
int main()
{
    int a = 1;
    //1.访问的是局部变量
    printf("%d\n", a);
    //2.通过域作用符限定访问全局变量
    printf("%d\n", ::a);
    return 0;
}

2.命名空间域

  • 为什么会提出命名空间域的概念?
    命名空间域的提出是为了防止定义变量时发生命名冲突,有时我们定义的一些变量会跟库里面的一些名称相同,此时就会发生冲突,编译器无法识别。
namespace ll
{
    int rand = 10;
    int x = 20;
}
int main()
{
    //此处的rand访问的是库里面的rand变量,打印出来的是一个地址
    printf("%p\n", rand);
    //这里是访问空间域中的变量
    printf("%d\n", ll::rand);
    printf("%d\n", ll::x);
}

first
只有定义在函数里面的才是局部变量

  • 命名空间不影响变量的生命周期,影响的是查找规则
    命名空间域影响的是编译查找规则,限定查找的域。如果指定了就在指定里面找。
    默认查找规则是:现在局部找,再去全局找。

  • 域中的变量存在哪?
    静态区

  • 命名空间中还可以定义函数和类型

namespace ll
{
	int Add(int left, int right)
	{
		return left + right;
	}

	struct Node
	{
		int val;
		struct Node* next;
	};
}
  • 命名空间还可以嵌套命名空间
namespace N1
{
	int Add(int left, int right)
	{
		return left + right;
	}

	namespace N2
	{
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}

int main()
{
    //嵌套命名空间的访问方式
	N1::N2::Sub(3, 2);
}
  • std C++官方库定义的命名空间
#include <iostream>
using namespace std;
//日常练习可以将官方库展开
//项目里面不要这么用
//还可以部分展开(下面会举例),即指定展开
int main()
{
    std::cout<<"hello,world"<<std::endl;
    cout<<"hello,world"<<endl;
    return 0;
}
#include <iostream>
//指定展开方式,常用的展开,自己定义的时候避免根常用的冲突
//在项目里面可以只需常用的展开,自己定义的时候避免跟常用重名即可
using std::cout;
int main()
{
    cout<<"hello,world";
    return 0;
}

C++允许定义多个同名得命名空间,会自动合并成一个命名空间(将命名空间看成一堵墙)。
好处:该命名空间中需要包含得内容可能很多,分布在多个文件。

2.cout和cin

cout和cin的优点是自动识别类型,因为实现了运算符重载和函数重载。
(此次大概来了解,后续会有补充)
流插入运算符<<
流提取运算符>>
格式化控制一般还是使用printf/scanf

3.缺省参数

全缺省参数,全缺省的调用非常灵活
半缺省参数(部分缺省),只能从左往右连续缺省
注意:传参数只能从左往右依次传,不能将中间空出来

void func(int a = 0)
{
	std::cout << a << std::endl;
}
int main()
{
	func();
	func(10);
	return 0;	
}
void func(int a = 10, int b = 20, int c = 30)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}
void func1(int a, int b = 20, int c = 30)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}
int main()
{
	func(1, 2, 3);
	//func(1, , 2);  不支持
	func(1, 2);
	func1(1);//第一个参数必须要传参
	return 0;
}

缺省参数不能在声明和定义里面同时出现,防止出现歧义(编译器不允许)
一般听.h中,即在声明中就要给出缺省值

4.函数重载

函数名相同,参数不同(顺序,个数,类型)
函数重载或者缺省参数可能会引发二义性,调用不明确

void func(int a = 0, char b = 0)
{
	cout << a << endl;
	cout << b << endl;
}
void func(char a = 0, int b = 0)
{
	cout << a << endl;
	cout << b << endl;
}
int main()
{
	//func();   函数调用不明确,产生二义性
	return 0;	
}
5.函数重载的原理(编译原理)

C语言不支持函数重载
C++支持
why???
函数调用本质是call一个地址
符号表里面存着函数名及其函数的地址
由于C++函数名修饰规则不同,C++能够支持函数重载。

返回值不同,能不能构成重载???
为什么不能?
是因为函数名修饰规则没有带返回值吗?

返回值不同,不构成重载的原因,并不是函数名修饰规则,真正原因是调用的二义性,调用时不指定返回值类型

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值