文章目录
c++入门学习概念
今天这篇文章开始正式开启c++的学习,本篇文章的重点是介绍一些c++内的基础概念,方便后续理解新的知识。同时与c语言进行一些对比
c++的第一个程序
说到编程语言的第一个程序,那必然是能够成功的输出HelloWorld了,现在让我们来看看如何在c++文件中输出这个语句:
#include<iostream>
int main() {
std::cout << "Hello World!" << std::endl;
return 0;
}
当然有些会稍微改进一下:
#include<iostream>
using namespace std;
int main() {
cout << "Hello World!" << endl;
return 0;
}
这就跟第一次学习c语言的时候一样,基本上是看不明白为什么这么写的,但是这个部分只是引入一下。后面将会对这些概念做讲解,以便能较快入门c++。
在这里我们先记住,#include<iostream>
这个操作就和#include<stdio.h>
一样重要即可。
命名空间
namespace关键字
在c语言程序中我们常常会碰见一下一个情况
#include<stdio.h>
#include<stdlib.h>
int rand = 0;
int main(){
printf("%d", rand);
return 0;
}
进行编译会发现这是会报错的。因为我们知道在stdlib.h头文件中包含了库函数rand,但是我们又定义了一个全局变量rand,那这就导致命名冲突了。这是c语言的一个弊端。那有没有办法能区分呢?
答案就是使用关键字namespace进行操作,进行一个命名空间的声名。在该命名空间内,变量声名是不能重复的。但是当前命名空间内与外界(全局),库函数中的变量却是可以同名的
我们先来看看namespace的解释:
1.定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
2.namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不在冲突了。
3.C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量生命周期。namespace只能定义在全局,当然他还可以嵌套定义。
4.项目工程中多文件中定义的同名namespace会认为是⼀个namespace,不会冲突。
5.C++标准库都放在⼀个叫std(standard)的命名空间中。
现在来一条一条解释:
第一、二条
也就是说,定义一个命名空间的格式是 namespace 空间名{},{}内就是在这个空间内的成员,成员不仅仅可以是变量,也可以是函数、类型(类)等。
现在来看一段代码:
#include<iostream>
#include<stdlib.h>
int rand = 0;
namespace hh{
int rand = 0;
int a = 0;
int add(int x,int y){
return x + y;
}
}
int a = 0;
int main(){
...
}
现在我们来看,全局区定义了一个叫"hh"的命名空间,是一个独立的域。里面定义了一个变量叫rand、还有一个变量a、函数add。全局区域定义了一个变量a,stdlib.h文件中还有函数rand。有很多名字是冲突的。但是经过命名空间的处理,这个问题就被解决了。也就是说,这个域是隔离其他之外的一个单独的空间,内部的名字不冲突即可。
当然可以定义多个不同的命名空间,每个空间只要保证内部不冲突就行,即使每个空间内声名的变量名以及函数名一样也不怕。
第三、四条
C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑。
局部域就可以理解为在一个函数内部开辟一个临时变量,当这个函数结束调用,函数栈帧会被销毁,那么这个临时变量就会被销毁,那么其生命周期只存在于这个函数调用期间。
而全局域即全局变量,从程序进程开始就存在于系统中,直到函数进程结束才销毁。其生命周期和程序进程有关。而因为命名空间只能在全局区域定义,所以类似于全局变量,并没有改变其生命周期,只不过是使用的时候要额外使用一些查找逻辑。
而类是c++的另外一个知识点,不是入门知识点,在这篇文章中先不进行讲解。
如果我们使用多文件管理,特别是在项目开发过程中难免会碰到不同程序员之间的命名也会冲突,这个时候就可以进行嵌套定义,隔离开两个域,这样子就不会起冲突了
#include<iostream>
namespace GDUT {
namespace yang {
int a = 10;
int b = 1;
}
namespace liu {
int a = 20;
int b = 2;
}
namespace chen {
int a = 30;
int b = 3;
}
}
也就是将GDUT这个域分为三部分,这三部分又是相互独立的,那么内部的成员变量名字不同也是不会出问题的。
当然在多文件管理中可能也会出现这么个情况,那么我们也可以使用命名空间操作对函数的定义和函数的实现加入到自定义的域中,防止出现命名冲突。但是多个文件下,如果起太多不相同的域名是很难记住的,所以c++规定了不同文件中只要命名空间名是一样的,那么系统将会把苏所有的同名的认为是同一个命名空间域。
第五条
c++标准库内有标准的命名空间std(standard),我们在第一个部分的时候就用到了,这个等下说到c++的输入输出的时候再说。
总的来看,c++解决了c语言中会出现的命名冲突问题,这是非常大的改进。
域作用限定符
对命名空间概念讲完后,这个时候就得想,那该如何使用不同域中的同名变量呢?
这个时候就需要用到域作用限定符::。在之前学习c语言的时候,我们遇见过下面这个案例:
#include<stdio.h>
int a = 1;
int main(){
int a = 2;
pri