C++におけるint iとint&iの注意点

2003 ワード

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;
}

コンピュータで実行すると、最初の数字は正常で、2番目の数字は明らかに定義されていない値です.例えば、私が実行した結果は
45  1400458944
これは,オブジェクトを構築する際にコンストラクション関数を呼び出し,Aのコンストラクション関数のパラメータが伝達されるため,呼び出すと1つのコンストラクション関数に相当する.
int b = 60 

存在するが、i 2(b)は
int &i2 = b;
コンストラクション関数呼び出しが完了すると、bの役割ドメインが終了し、bが破棄され、i 2が破棄された場所を指すため、未定義の実行結果が現れる.
私たちはもう1段のプログラムを貼って、上の1段に対応して、ただ、今回、私たちは4560の結果を得ることができます
#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;
}