最新<C++>快来精通C++的“Hello world,2024年最新解析底层原理

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取


你是否曾经有那么一丢丢的疑惑`using namespace std;`是干啥的?


稍等,我们再看几个例子,铺垫铺垫:



#include
using namespace std;
#include<stdlib.h>//里面有个叫rand的函数

int rand = 0;
int main()
{
printf(“%d\n”, rand);
return 0;
}


![image-20220502111326193](https://img-blog.csdnimg.cn/img_convert/343675a66f22e2ccd55ba60e92c9efcd.png)


因为<stdlib.h>里面有个叫rand的函数因此我们定义的变量重名了。


为了解决命名冲突问题,CPP引入namespace命名空间定义


**定义命名空间**,需要使用到namespace**关键字**,后面跟**命名空间的名字**,然后接一对{}即可,{}中即为命名空间的成员



#include
using namespace std;
#include<stdlib.h>//里面有个叫rand的函数

//为了解决命名冲突问题,CPP引入namespace
//同一个域里面不能有重名变量
namespace cpp//命名空间域,这里起名为cpp,本空间与外界空间进行隔离
{
int rand = 0;
}
int main()
{
printf(“%d\n”, rand);
return 0;
}


![image-20220502112558635](https://img-blog.csdnimg.cn/img_convert/6f344635e26be00f675ee9e55dd64aa9.png)


成功通过了,但这里打印的不是0,而是一串数字。因为这里打印的是函数rand的地址,而不是rand变量的大小(因为rand变量被cpp命名空间关起来了,函数rand和变量rand就不在同一个域了,不会有命名冲突问题)。


那如果我想要访问变量rand该怎么做呢?我们引入`::` 域作用限定符,访问cpp命名空间里的rand



#include
using namespace std;
#include<stdlib.h>//里面有个叫rand的函数

//为了解决命名冲突问题,CPP引入namespace
//同一个域里面不能有重名变量
namespace cpp//命名空间域,这里起名为cpp,本空间与外界空间进行隔离
{
int rand = 0;
}
int main()
{
printf(“%d\n”, cpp::rand);//:: 域作用限定符,::前面是空白就默认全局域
return 0;
}


![image-20220502174334893](https://img-blog.csdnimg.cn/img_convert/3b6e1a9a4bd3ae163638a5d9afecf1c9.png)


### 2.1 命名空间定义


1️⃣命名空间中的内容既可以定义变量,也可以定义函数和类型



namespace tyyg // tyyg为命名空间的名称
{
// 命名空间中的内容,既可以定义变量,也可以定义函数和类型
int a;//变量

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

struct ListNode//类型
{
    int val;
    struct ListNode\* next;
};

}


2️⃣命名空间可以嵌套使用,例如:



namespace OUT//外
{
int a;
int b;
namespace IN//内
{
int c;
int Sub(int left, int right)
{
return left - right;
}
}
}


3️⃣同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。



//data.h
namespace abc
{
int a = 0;//a还是全局变量,命名空间不影响生命周期,只是把a隔离开了
namespace data
{
struct Node
{
int val;
struct Node* next;
};
}
}

//cache.h
namespace abc
{
int b = 0;
namespace cache
{
struct Node
{
int val;
struct Node* next;
};
}
}

int main()
{
struct abc::data::Node n1;
n1.val = 1;

struct abc::cache::Node n2;
n2.val = 3;

return 0;

}


它们在不同的文件中,编译器最后会合成同一个命名空间abc中,为了区分两个Node,我们嵌套了一层命名空间。最后通过`::`来创建两个不同类型的结构体变量n1和n2。(这里的`struct abc::data::Node`只是一种类型)


### 2.2 命名空间使用


如果我想简化一下,不想写`abc::`,我该怎么改呢?



//data.h
namespace abc
{
int a = 0;//a还是全局变量,命名空间不影响生命周期,只是把a隔离开了
namespace data
{
struct Node
{
int val;
struct Node* next;
};
}
}

//cache.h
namespace abc
{
int b = 0;
namespace cache
{
struct Node
{
int val;
struct Node* next;
};
}
}

//这里的意思是把abc这个命名空间定义的东西放出来
using namespace abc;
int main()
{
struct data::Node n1;
n1.val = 1;

struct cache::Node n2;
struct cache::Node n3;
struct cache::Node n4;
struct cache::Node n5;
n2.val = 3;

return 0;

}


这里要用`using namespace abc;`这个语句,意思是把abc这个命名空间定义的东西放出来。要按顺序从外到内展开,否则会找不到。另外还能`using namespace abc::data;`这样只展开一部分,只展开abc里的data,不展开abc里的cache。一般我们最好用什么展开什么,以免又引起重名(好不容易搞个命名空间,一放回到解放前)。


是不是很眼熟?还记得hello world吗,那个`using namespace std;`也是这个作用。如果我们不加`using namespace std;`该怎么写?



![img](https://img-blog.csdnimg.cn/img_convert/c5cc270b041f57dd725518a65b1a64b6.png)
![img](https://img-blog.csdnimg.cn/img_convert/5b1b9af8745a2e69317f333ca4745ab4.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

169709)]
[外链图片转存中...(img-Cr21SGGr-1715882169710)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值