作用域命名控制
冒号作用域::
::a \\全局变量的a
std::a \\命名空间std的作用域下的a
命名空间namespace
namespace A
{
int a=0; //变量
void foo() //函数
{
cout<<"hello"<<endl;
}
struct a{}; //结构体
class b{}; //类
namespace B //嵌套命名空间
{
int a=50;
}
}
namespace newA=A; //取别名
namespace //命名空间没有名字
{
int a=100; //相当于static int a;
}
- 必须定义在全局范围
- 可以存放变量,函数,结构体,类
- 定义可以重名,相当于合并
using的声明指令
作用:使得指定标识符可用
void test
{
using A::a; //声明命名空间A的a可用
using A::foo(); //声明命名空间A的foo函数可用
cout<<a<<endl; //打印的是命名空间A的a
foo(); //不用加作用域便可用命名空间A的foo
int b=100; //当作用域有冲突,会有二义性,编译出错
using B::b;
cout<<b<<endl;
}
using的编译指令
作用:使整个命名空间可用
void test()
{
int a=100; //不会产生二义性
using namespace A; //使整个命名空间可用
cout<<a<<endl; //就近打印的是函数内的a
}
helloword程序
include<iostream> //标准的输入输出头文件
using namespace std; //使用命名空间的编译指令使标识符cout可用
void main()
{
cout<<"helloworld"<<endl;
}
C++较于C的增强
全局变量的检测增强
C语言下:
int a; //定义
int a; //声明
int a; //声明
C++语言下:
int a;
extern int a;
extern int a;
C++中形参必须有类型、返回值和实参个数做检测
C语言:函数的形参类型可以不写,没有返回值可以返回,实参个数不做检测。
C++语言:函数的形参类型必须不写,没有返回值不可以返回,实参个数做检测。
更严格的类型转换
C语言:
char *p=malloc(1024);
C++语言:
char *p=(char *)malloc(1024);
struct类型增强
C语言:
struct stu a;
C++语言:
stu a; //struct关键字可以不写
bool类型增强
C语言:
#include<stdbool.h>
C++语言:
不用头文件
三目运算符增强
C语言:
c=a<b?a:b; //返回的是a或b的值
C++语言:
a<b?a:b=100; //返回的是变量a或b可以再赋值
const修饰
C语言:
const 局部变量; //存在栈区,可通过地址修改值
const 全局变量; //存在常量区,不能修改; 其他文件使用要用extern修饰声明外部可用,默认外部链接属性
C++语言:
const 局部变量; //存在符号表,不能修改
const 全局变量; //存在常量区,不能修改; 默认内部链接属性,extern修饰变外部链接属性
const和define
const int max=1024; //有类型(int),有作用域(局部/全局)
define max 1024 //没类型,没作用域
引用
实质:取别名
原类型 &别名=旧名
type &new=old;
用法:
- 一旦初始化,不能改变指向
- 定义时必须初始化
- 不能指NULL
- 可以引用任意类型包括数组
-
int (& arr)[5]=a;
- 指针引用(type=int *)
内联函数
宏函数:替换发生在预处理阶段,不能作为类的成员函数,易出错,省去函数调用
#define ADD(a,b) a+b
int c=ADD(a,b)*5 //a+b*5
内联函数:替换发生在编译阶段,可作类的成员函数,不会出错,省去函数调用
inline int ADD(int a, int b)
{
return a+b;
}
int c=ADD(a,b)*5 //(a+b)*5
注:在类内部定义的函数自动成为内联函数
内联函数的限制:
- 不能存在循环语句
- 不能过多条件语句
- 函数体不能过于庞大
- 不能对函数进行取址操作
函数的默认参数
void foo(int a=1, int b=2);
注:
- 设置了默认参数,往后的参数都要设置
- 声明和定义只能设置一处
- 有实参传入用实参,没有用默认参数
占位参数
void foo(int a,int=4)
给函数形参设置的,调用也要传参,也可设置占位参数为默认参数
函数的重载
(函数名相同)
发生重载条件:
- 同一作用域
- 参数个数不同
- 参数类型不同
- 参数顺序不同
- 函数返回值不能作为条件
- 默认参数会产生二义性
extern "C"
C++编辑器编译.c的函数时,需要声明extern "C"
1.cpp中:
# include "1.h"
int main()
{
cout<< ADD(2,3) << endl;
}
1.c中:
int ADD(int a,int b)
{
return a+b;
}
1.h中:
#pragma once
#if __cplusplus
extern "C"{
#endif
int ADD(int a,int b);
#if __cplusplus
}
#endif