作用域和命名空间
c++面向对象 oop
作用域 :: 相当于python的.
命名空间 namespace,其几点注意如下
- 命名空间只能在全局范围定义,不能在函数内部定义 2. 命名空间可以嵌套 A:B:a 是可以的
- 命名空间是开放的,可以初始化后再添加 4.可以声明和实现分离 5.可以对命名空间取别名
namespace A{
int a = 10;
int b = 10;
}
void test01()
{
cout << A::a <<endl;
using namespace A; // using 可以声明命名空间,这样就不用写A::b,算是简写化,但是也有冲突的问题,除非特别大的项目否则不推荐
cout << b << endl;
}
reference
引用 reference 在c/c++中指针的作用基本都是一样的,但是c++增加了另一种给函数传递地址的途径,叫按引用传递(pass-by-reference)
引用的本质就是给变量取别名
步骤说过很多次,这里记录一次 1. &别名 2.给哪个变量取别名 就定义该变量 3.从上往下整体替换 (替换的是原来的名字,不包括( )和[ ]等)
例子
- &myarr 2. int arr[5] 3.int (&myarr)[5] = arr
- &myp 2. int *p 3. int *&myp = p
- &myfunc 2. void func(void) 3. void (&myfunc)(void) = func
void test02()
{
int a = 10;
// 给变量a取别名b,引用必须初始化,系统不会为引用开辟空间
int &b = a;// 注意这里不是取地址符!!!这里是修饰变量为引用 b就是a的引用!!!
//操作b等价与操作a,a和b代表同一空间内容
cout << &a << endl;
cout << &b << endl;// 两个的地址都是一样的
b = 100;
cout << a << endl;// 操作了b相当于操作了a
}
作用:引用不用取地址函数内部也能操作外部变量
void swap01(int a,int b)
{
int c = a;
a = b;
b = c;
}
void swap02(int *a,int *b)
{
int c = *a;
*a = *b;
*b = c;
}
void swap03(int &a,int &b)
{
int c = a;
a = b;
b = c;
}
void test03()
{
int a = 10;
int b = 20;
// swap01(a,b); // a = 10, b = 20
// swap02(&a,&b);// a = 20, b = 10
swap03(a,b);// a = 20, b = 10 三个对比就是引用的作用,引用不用取地址函数内部也能操作外部变量
cout << "a = "<<a<<endl;
cout <<"b = " <<b<<endl;
}
常引用 const int &a
在作为函数的输入参数用引用,函数内部的修改会导致整个进程中该参数发生修改,当不想发生整个情况时,用常引用
void swap04(const int &a,int &b)
{
int c = a;
// a = b; //报错
b = c;
}
void test04()
{
int a = 10;
int b = 20;
swap04(a,b);// a = 10, b = 10 用了常引用 a的值不能变化
cout << "a = "<<a<<endl;
cout <<"b = " <<b<<endl;
}