- using声明和编译指令
- const一些理解
- 参数传递
- 引用
using声明和编译指令
#include<iostream>
using namespace std;
namespace LOL {
int yasuo = 1;
}
void test() {
int yasuo = 2;
//using 声明 注意避免二义性问题
//编译具有就近原则
//此处使用 using 声明 使得后续 yasuo 变成 LOL 下的;将导致二义性
//using LOL::yasuo;
cout << yasuo << endl;
}
//using 编译指令
namespace lol {
int yasuo = 3;
}
void test1() {
int yasuo = 2;
using namespace LOL;//打开LOL房间
//只使用一个 using 编译指令 无二义性问题
using namespace lol;//打开lol房间
//如果打开多个房间,且局部范围内无(//int yasuo=2),也要注意二义性问题
cout << yasuo << endl;
}
int main() {
//test();
test1();
return 0;
}
const一些理解
-
C++中, const不会分配内存的情况:
const int b =10;利用指针也不会改变 const 的值;指针只会指向临时开辟的一块内存空间 -
C++中, const默认是内部链接, 需要
external const才能在其他文件找到。 -
用普通变量初始化const变量,会分配内存,也就是说能改变值 :
int a =10; const int b = a; -
自定义数据类型 加 const 也会分配内存
#include<iostream>
#include<string>
using namespace std;
//4. 自定义数据类型 加 const 也会分配内存
struct Person {
string m_name ="666";
int m_age;
};
void test() {
const Person p1;
//p1.m_name = "aaa";
Person *p = (Person*) &p1;
p->m_name = "hhhhhhh";
(*p).m_age = 15;
cout << p1.m_name << endl << p1.m_age << endl;
}
int main() {
test();
return 0;
}
参数传递
1. 值传递
void swamp(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
cout << "my swamp a =" << a << endl;
cout << "my swamp b=" << b << endl;
}
void test()
{
int a = 10;
int b = 20;
swamp(a, b);//值传递
cout << "my a =" << a << endl;
cout << "my b=" << b << endl;
}
2. 地址传递
void swamp2(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
cout << "my swamp a =" << *a << endl;
cout << "my swamp b=" << *b << endl;
}
void test2()
{
int a = 10;
int b = 20;
swamp2(&a, &b);
cout << "my a =" << a << endl;
cout << "my b=" << b << endl;
}
3.引用传递 (类似 地址传递 )
void swamp3(int & a, int &b)
{
int tmp = a;
a = b;
b = tmp;
cout << "my swamp a =" << a << endl;
cout << "my swamp b=" << b << endl;
}
void test3()
{
int a = 10;
int b = 20;
swamp3(a, b);
cout << "my a =" << a << endl;
cout << "my b=" << b << endl;
}
引用
引用注意事项
- 引用基本语法 Type &别名 = 原名
- 第二种方式 起别名
void test1()
{
int arr[10];
//对数组起别名
int (&parr)[10] = arr;
//第二种方式 起别名
typedef int(ARRAY)[10] ;//typedef 能确定类型 ARRAY 是类型名称。
ARRAY &parr2 = arr;
}
- 引用必须初始化
- 必须引用一块合法的内存空间;此类初始化错误 int &a = 10(X)
- 不要返回局部变量的引用
- 引用:地址只能赋值一次
int& dowork()
{
int a = 10;//int static a = 10;解决问题,用static延长生命周期
return a;
}
void test4()
{
int& ret = dowork();//此时是错误的,因为dowork()返回的a是局部变量,在生命周期在函数执行完就结束了,此时ret值会乱
cout << "ret = " << ret << endl;
cout << "ret = " << ret << endl;
//如果函数返回值是引用,那么这个函数调用可以作为左值
//dowork() = 1000; 相当于 a =1000;
}
利用指针引用开辟空间
注意:使用指针必须先初始化,开辟内存
struct Person
{
int m_age;
};
void allocateMemory(Person* &p)//指针的引用
{
p = (Person*)malloc(sizeof(Person));
}
void test2()
{
Person* p = NULL; // 使用指针必须先初始化,开辟内存!!!!!!
allocateMemory(p);
p->m_age = 20;
cout << "age = " << p->m_age << endl;
}