目录
1.命名空间(namespace关键字)
在C/C++中,变量、函数、类等都是大量存在的,这些变量、函数和类的名称都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。
1.错误代码:
#include <stdio.h>
#include <stdlib.h>
int rand = 0;
int main()
{
printf("%d",rand);
return 0;
}
这段代码会出现错误:主要原因是:在stdlib.h中存在rand函数,又定义了一个全局变量,会出现命名冲突。所以这样会出现错误或者警告。
2.修改错误代码:利用namespace关键字,
#include <stdio.h>
#include <stdlib.h>
namespace n1
{
int rand = 0;
}
int main()
{
printf("%d",n1::rand);
return 0;
}
3.命名空间定义
定义命名空间,需要使用到namesapce关键字,后面跟命名空间的名字,然后接一对{ }即可,{ }中
即为命名空间的成员。
普通的命名空间:
命名空间中的内容,可以是定义变量,也可以定义函数。
namespace N1 // N1为命名空间的名称
{
// 命名空间中的内容,既可以定义变量,也可以定义函数
int a;
int Add(int left, int right)
{
return left + right;
}
}
命名空间可以嵌套:
namespace N2
{
int a;
int b;
int Add(int left, int right)
{
return left + right;
}
namespace N3
{
int c;
int d;
int Sub(int left, int right)
{
return left - right;
}
}
}
同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
namespace N1 // N1为命名空间的名称
{
int a;
int Add(int left, int right)
{
return left + right;
}
}
namespace N1
{
int Mul(int left, int right)
{
return left * right;
}
}
会合成一个命名空间:
namespace N1 // N1为命名空间的名称
{
int a;
int Add(int left, int right)
{
return left + right;
}
int Mul(int left, int right)
{
return left * right;
}
}
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
4.命名空间的使用:
对以下命名空间的使用有三种方式:
namespace N {
int a = 10;
int b = 20;
int Add(int left, int right)
{
return left + right;
}
int Sub(int left, int right)
{
return left - right;
}
struct Node
{
int a;
char b;
};
}
1.加命名空间名称及作用域限定符
只有结构体比较特殊需注意。
int main()
{
//变量的使用:
printf("%d\n", N::a);
//函数的使用:
N::Add(1, 2);
//结构体的使用
struct N::Node node;
return 0;
}
2.使用using将命名空间中成员引入
using N::a;
using N::Node;//注意结构体
int main()
{
printf("%d\n",a);
Node LT;
return 0;
}
3.使用using namespace 命名空间名称引入(这种方式需要慎用,这样就相当于命名空间失效,空间中所有定义的变量等都是全局)
using namespace N;
int main()
{
printf("%d\n",b);
printf("%d\n",a);
Node LT;
LT.val = 1;
return 0;
}
2.C++输入&输出
1.输出
#include <iostream>
using namespace std;
int main()
{
cout << "Hello world" << endl;
return 0;
}
需要包含头文件<iostream> ,需要打开std的空间,才能使用cout函数。<< 流插入这个符号可以看作是输出流(流向什么),cout为标准输出(控制台),把"Hello world"字符串流向控制台。endl相当于C语言中的 换行 \n 。>>流提取
注意:早期标准库将所有功能在全局域中实现,声明在.h 后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器(V6.0)中还支持<iostream.h>格式,后续编译器已不支持,因此推荐使用<iostream>+std的方式。
2.输入:输入数据时以空格或回车为两个值的间隔,不会读取
#include <iostream>
using namespace std;
int main()
{
int a;
double b;
char c;
cin >> a;
cin >> b >> c;
cout << a << endl;
cout << b << c << endl;
return 0;
}
C++的输入输出与C语言的输入输出相比:输入和输出在使用时更加的方便,不需要增加数据格式控制,比如整形%d,字符%c.如果需要控制打印位数或者格式,可以使用printf,C++是支持C语言的,因此,在写代码时,可以写C++也可以写C语言,有点意思。即可以不用,但不排斥。很爽。那个方便就用那个。
3.缺省参数
1.什么是缺省参数
#include <iostream>
using namespace std;
void fun(int a=0)//缺省参数
{
cout << a << endl;
}
int main()
{
fun(1);//可以传参
fun();//不传参,打印缺省值
return 0;
}
结果:
2.全缺省参数
#include <iostream>
using namespace std;
void fun(int a=10,int b=20,int c=30)//全缺省参数
{
cout << a << endl;
cout << b << endl;
cout << c << endl<<endl;
}
int main()
{
//全缺省的传参
fun();
fun(1);
fun(1,2);
fun(1, 2,3);
return 0;
}
结果:
4.半缺省参数-缺省部分参数-必须从右向左缺省
void fun(int a,int b=20,int c=30)//半缺省参数
{
cout << a << endl;
cout << b << endl;
cout << c << endl<<endl;
}
半缺省传参:
#include <iostream>
using namespace std;
void fun(int a,int b=20,int c=30)
{
cout << a << endl;
cout << b << endl;
cout << c << endl<<endl;
}
int main()
{
fun(1);
fun(1,2);
fun(1, 2,3);
return 0;
}
没有缺省的参数必须传参,缺省的参数可以传,也可以不传。
注意:1.半缺省参数必须从右向左依次给出来,不能间隔给。
2.给参数时是从左向右依次给。
3.缺省参数不能再函数声明和定义中同时出现
text.cpp:
#include "test.h"
void StackInit(struct stack* ps, int capacity = 4)//给缺省参数
{
}
void StackPush(struct stack* ps, int x)
{
//
}
text.h:
#pragma once
#include <iostream>
void StackInit(struct stack* ps, int capacity = 4);
这样会出错,再函数声明和定义只能出现一个。 推荐写在声明中。
缺省参数在实际编程中的意义:
struct stack
{
int* a;
int top;
int capacity;
};