C++中 int i 与 int &i 注意事项

本文深入探讨了C++中int变量与引用的区别,包括参数传递、常量赋值及内存别名的特点,并通过实例展示了类成员变量引用的正确使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.int i 传值,int & i 传引用

int i不会回带参数,而int &i可以回带参数,如

#include <iostream>

void test1(int i)
{
	i = 7;
}

void test2(int &i) //要限制参数改动,可以加const限制
{
	i = 7;
}

int main()
{
	int t1 = 10;
	test1(t1);
	std::cout << t1 << std::endl; //输出为10

	int t2 = 10;
	test2(t2);
	std::cout << t2 << std::endl;	//输出为7

	return 0;
}

2. int i 可赋予常量,而int & i 不能

#include <iostream>

void test1(int i)
{
	i = 7;
}

void test2(int &i)
{
	i = 7;
}

int main()
{
	int i = 10;		//合法
	int &i1 = 10;	//编译错误

	test1(10);		//合法
	test2(10);		//编译错误

	return 0;
}

3. int &i 相当于别名,而int i 只是拷贝

#include <iostream>

int main()
{
	int t1 = 10;
	int t2 = 10;
	int i1 = t1;	//复制
	int &i2 = t2;	//别名
	
	i1 = 7;
	i2 = 7;

	std::cout << t1 << std::endl;	//输出10
	std::cout << t2 << std::endl;	//输出7

	return 0;
}

最后,我们再来看一下个例子

#include <iostream>
class A{
public:
	A(int a, int b):i1(a),i2(b){};

public:
	int i1;
	int &i2;
};

int main()
{
	A a(45,60);
	std::cout << a.i1 << " " << a.i2 << std::endl;
	return 0;
}

在电脑上运行之后,你会发现,第一个数字正常,而第二个数字明显是一个未定义的值,例如我运行后得到的结果是

45  1400458944

这是因为我们在构造一个对象的时候,调用了构造函数,而A的构造函数的参数传递为传值方式,所以,当调用时,相当于有一个

int b = 60 
存在,而 i2(b) 相当于将
int &i2 = b;
而当构造函数调用完成,b的作用域结束,b被销毁,而i2指向一个已经被销毁的地方,所以会出现未定义的运行结果。
我们再贴一段程序,和上面的一段相对应,只是,这次,我们将会获得 45 60  的结果
#include <iostream>
class A{
public:
	A(int a, int &b):i1(a),i2(b){};

public:
	int i1;
	int &i2;
};

int main()
{
	int t  = 60;
	A a(45,t);
	std::cout << a.i1 << " " << a.i2 << std::endl;
	return 0;
}
<think>嗯,用户之前问过关于C语言中常成员函数的问题,现在转向C++中的int &amp;i=j。我需要确认用户的基础,可能刚开始学习C++,尤其是引用这一块。 首先,用户可能已经知道变量声明,比如int i = j,但这里的&amp;符号可能让他们困惑。需要解释引用和指针的区别,因为用户可能之前接触过指针,但引用是C++特有的。 要明确int &amp;i = j的意思,就是i是j的引用,也就是别名。引用必须在声明时初始化,之后不能更改指向,这和指针不同。用户可能想知道引用的用途,比如函数参数传递或返回值,避免复制大对象,或者修改外部变量。 还要注意常见的错误点,比如引用不能指向临时变量(除非是const引用),或者引用必须初始化。可能用户在实际编码中遇到了相关问题,或者看到别人的代码里有这样的写法,需要理解其含义。 另外,用户可能混淆引用和指针的语法,比如使用.还是->,或者如何传递引用参数。需要举例说明,比如在函数中修改引用会影响原变量,而按值传递不会。 可能还需要对比引用和指针的区别,比如引用更安全,不能为NULL,必须初始化,而指针更灵活,但容易出错。这样用户能理解为什么C++引入引用这个概念。 总结下来,回答需要分步骤:定义、特性、指针的区别、使用场景、注意事项,加上代码示例帮助理解。确保用中文清晰解释,避免术语混乱,帮助用户逐步建立正确的概念。</think>在 **C++** 中,`int &amp;i = j` 的含义是:**声明一个引用变量 `i`,并将其绑定到已存在的变量 `j` 上**。以下是详细的解释: --- ### 一、核心概念:**引用(Reference)** 1. **引用是什么?** - 引用是变量的“别名”(alias),即给一个已存在的变量起另一个名字。 - **本质**:引用在底层通过指针实现,但对程序员透明(无需手动解引用)。 2. **语法规则** - 声明时必须初始化(绑定到某个变量)。 - 类型必须绑定的变量类型严格匹配(除非涉及 `const` 或继承)。 - 示例: ```cpp int j = 10; int &amp;i = j; // i 是 j 的引用 ``` --- ### 二、具体行为分析 #### 1. **引用原始变量的关系** - **共享内存地址**:引用 `i` 和变量 `j` 指向同一块内存,修改任意一方都会影响另一方。 ```cpp i = 20; // 修改 i 的值 cout << j; // 输出 20(j 的值也被修改) ``` - **无法重新绑定**:引用一旦初始化后,不能再绑定到其他变量。 ```cpp int k = 30; i = k; // 这是赋值操作,不是重新绑定!i 和 j 的值变为 30 ``` #### 2. **引用的底层实现** - 引用本质是一个常量指针(`int* const ptr`),即指针本身不可修改,但指向的值可修改。 - 对比指针: ```cpp int j = 10; int &amp;i = j; // 引用:直接操作变量名 int *p = &amp;j; // 指针:需通过 *p 操作值 ``` --- ### 三、引用的典型用途 1. **函数参数传递** - 避免拷贝大型对象,同时允许函数内部修改外部变量: ```cpp void swap(int &amp;a, int &amp;b) { int tmp = a; a = b; b = tmp; } ``` 2. **函数返回值** - 返回引用可避免拷贝,但需确保返回的变量生命周期足够长(如类的成员变量)。 ```cpp int&amp; getElement(int arr[], int index) { return arr[index]; } ``` 3. **范围 for 循环** - 修改容器中的元素: ```cpp vector<int> vec = {1, 2, 3}; for (int &amp;num : vec) { num *= 2; // 直接修改容器内的值 } ``` --- ### 四、引用指针的区别 | **特性** | **引用** | **指针** | |------------------|-----------------------------------|-----------------------------------| | 初始化 | 必须初始化 | 可以声明为 `nullptr` 或未初始化 | | 是否可为空 | 不能为空 | 可以指向空地址 | | 重新绑定 | 不可重新绑定 | 可以修改指向的地址 | | 语法操作 | 直接使用变量名(无需 `*` 或 `&amp;`) | 需通过 `*` 解引用,`&amp;` 取地址 | | 内存占用 | 通常不占用额外内存(编译器优化) | 占用指针大小的内存(如 4/8 字节) | --- ### 五、注意事项 1. **避免返回局部变量的引用** ```cpp int&amp; badFunction() { int x = 10; return x; // 错误!x 是局部变量,函数结束后内存被释放 } ``` 2. **常量引用(`const T&amp;`)** - 用于只读操作,可绑定到字面量或临时变量: ```cpp const int &amp;ref = 42; // 合法 ``` 3. **引用 `const` 的结合** - 若需通过引用修改原始变量,不能使用 `const` 修饰引用。 --- ### 六、示例代码 ```cpp #include <iostream> using namespace std; int main() { int j = 10; int &amp;i = j; // i 是 j 的引用 i = 20; // 修改 i 的值 cout << j << endl; // 输出 20 int k = 30; i = k; // 将 k 的值赋给 i(j 的值变为 30) cout << j << endl; // 输出 30 return 0; } ``` --- 如果对引用的其他用法(如右值引用、引用折叠等)感兴趣,可以进一步提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值