C++(using,const,参数传递,引用&)

288 阅读1分钟
  1. using声明和编译指令
  2. const一些理解
  3. 参数传递
  4. 引用

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一些理解

  1. C++中, const不会分配内存的情况: const int b =10; 利用指针也不会改变 const 的值;指针只会指向临时开辟的一块内存空间

  2. C++中, const默认是内部链接, 需要external const 才能在其他文件找到。

  3. 用普通变量初始化const变量,会分配内存,也就是说能改变值 : int a =10; const int b = a;

  4. 自定义数据类型 加 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;
}

引用

引用注意事项

  1. 引用基本语法 Type &别名 = 原名
  2. 第二种方式 起别名
void test1()
{ 
	int arr[10];
	//对数组起别名
	int (&parr)[10] = arr;
	//第二种方式 起别名
	typedef int(ARRAY)[10] ;//typedef 能确定类型 ARRAY 是类型名称。
	ARRAY &parr2 = arr;
}
  1. 引用必须初始化
  2. 必须引用一块合法的内存空间;此类初始化错误 int &a = 10(X)
  3. 不要返回局部变量的引用
  4. 引用:地址只能赋值一次
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;
}