C++ 引用变量(十二)-- & b *b和C的传递指针形参一样效果
2016-09-05 16:25
288 查看
#include <iostream>
#include <string>
using namespace std;
//引用用于类对象
string gestString(const string &s1 , const string &s2)
{
//创建临时变量
string temp;
//字符串拼接
temp = s2 + s1 + s2;
return temp;//注:如果是返回引用 &,不允许使用临时变量,这样导致引用指向一个已销毁的内存地址;
}
//引用用于结构体
struct tree {
int t;
int f;
long k;
};
void gestStruct(tree &g)
{
//临时拷贝
g.t = 100;
}
//普通函数形参为引用
void gest2(int g)
{
//两个变量,两个名称, 不可影响传入变量的原始值
g = 9999;
}
void gest(int &g)
{
//一个变量,两个名称, 直接关联传入变量值
g = 100;
}
void gestPoint(int *g)
{
//指针地址一样,直接关联传入变量值
int i = 200;
*g = i;
}
int gestConst(int const &g)
{
//引用参数为 const可以只使用,不改变
return g*g;
}
int main(int argc, const char * argv[]) {
int a = 10;
//1、以下等价,b、bb内存地址和a是一样
int & b = a;
int &c = a;
// int & f; //错误语法,初始化时必须赋值
int *const bb = &a; //说明引用变量其实是对a的指针和值复制,只能在初始化时设置,更接近于const指针,只能效忠于a
a = 20; //当引用变量或被引用的值发生改变,所有对象值都改变
int t = 20;
b = t;
//2、作为函数形参传递引用
cout << "传值前的 t = " << t << endl;
gest(t);
cout << "传值给引用函数后的 t = " << t << endl;
/**
打印:(可改变)
传值前的 t = 20
传值给引用函数后的 t = 100
*/
//3、作用:函数内部改变引用变量的值;
//如果需要对函数的实参要求改变后,值也跟着改变,那么值传递都不起作用
//示例:几种和引用对比
gestPoint(&t);
cout << "指针传值后的 t = " << t << endl;
/**
打印:(可改变)
传值给引用函数后的 t = 200
*/
gest2(t);
cout << "值传递后的 t = " << t << endl;
/**
打印:(不可变)
传值给引用函数后的 t = 200
*/
gestConst(t);
cout << "const值传递后的 t = " << t << endl;
/**
打印:(不可变)
const值传递后的 t = 200
*/
tree tr1 = {1,2,3};
gestStruct(tr1);
cout << "传入结构引用后" << tr1.t << endl;
/**
打印:
传入结构引用后100
*/
tree tr2 = {44,122,5678};
//4、将引用用于类对象
string input;
string copy;
string result;
copy = gestString(input,"sdff"); //string 可以接受 char * 类型字符串,内部实现转换
return 0;
}
#include <string>
using namespace std;
//引用用于类对象
string gestString(const string &s1 , const string &s2)
{
//创建临时变量
string temp;
//字符串拼接
temp = s2 + s1 + s2;
return temp;//注:如果是返回引用 &,不允许使用临时变量,这样导致引用指向一个已销毁的内存地址;
}
//引用用于结构体
struct tree {
int t;
int f;
long k;
};
void gestStruct(tree &g)
{
//临时拷贝
g.t = 100;
}
//普通函数形参为引用
void gest2(int g)
{
//两个变量,两个名称, 不可影响传入变量的原始值
g = 9999;
}
void gest(int &g)
{
//一个变量,两个名称, 直接关联传入变量值
g = 100;
}
void gestPoint(int *g)
{
//指针地址一样,直接关联传入变量值
int i = 200;
*g = i;
}
int gestConst(int const &g)
{
//引用参数为 const可以只使用,不改变
return g*g;
}
int main(int argc, const char * argv[]) {
int a = 10;
//1、以下等价,b、bb内存地址和a是一样
int & b = a;
int &c = a;
// int & f; //错误语法,初始化时必须赋值
int *const bb = &a; //说明引用变量其实是对a的指针和值复制,只能在初始化时设置,更接近于const指针,只能效忠于a
a = 20; //当引用变量或被引用的值发生改变,所有对象值都改变
int t = 20;
b = t;
//2、作为函数形参传递引用
cout << "传值前的 t = " << t << endl;
gest(t);
cout << "传值给引用函数后的 t = " << t << endl;
/**
打印:(可改变)
传值前的 t = 20
传值给引用函数后的 t = 100
*/
//3、作用:函数内部改变引用变量的值;
//如果需要对函数的实参要求改变后,值也跟着改变,那么值传递都不起作用
//示例:几种和引用对比
gestPoint(&t);
cout << "指针传值后的 t = " << t << endl;
/**
打印:(可改变)
传值给引用函数后的 t = 200
*/
gest2(t);
cout << "值传递后的 t = " << t << endl;
/**
打印:(不可变)
传值给引用函数后的 t = 200
*/
gestConst(t);
cout << "const值传递后的 t = " << t << endl;
/**
打印:(不可变)
const值传递后的 t = 200
*/
tree tr1 = {1,2,3};
gestStruct(tr1);
cout << "传入结构引用后" << tr1.t << endl;
/**
打印:
传入结构引用后100
*/
tree tr2 = {44,122,5678};
//4、将引用用于类对象
string input;
string copy;
string result;
copy = gestString(input,"sdff"); //string 可以接受 char * 类型字符串,内部实现转换
return 0;
}
相关文章推荐
- C++中函数用普通变量,指针,引用做形参的区别
- C++字符串变量作为函数形参传递(引用方式)
- C/C++函数形参传实参时值传递、指针传递、引用传递的区别
- C/C++函数形参传实参时值传递、指针传递、引用传递的区别
- 指针形参,引用变量,普通变量比较
- C++值传递、引用传递、指针传递以及STL模板堆的使用
- c++ 值传递 引用传递 指针传递
- C/C++中关于地址、指针和引用变量的学习笔记(八) : 命令行参数
- C++中按引用传递 和 指针
- 比较c++中的值传递,引用传递,指针传递
- C++ 参数传递方式:值传递,引用传递,指针传递
- C/C++中关于地址、指针和引用变量的学习笔记(十) : 引用型变量
- 根据C++标准,如果const的引用被初始化为对一个临时变量的引用,那么它会使这个临时变量的生命期变得和它自己一样
- C/C++中关于地址、指针和引用变量的学习笔记(二) : 数组
- C++中引用传递与指针传递区别
- C/C++中关于地址、指针和引用变量的学习笔记(三) : 结构
- C/C++中关于地址、指针和引用变量的学习笔记(七) : sizeof和typedef
- c++学习 按引用或指针传递提高效率
- 【转载】比较c++中的值传递,引用传递,指针传递
- 【转载】C++中引用传递与指针传递区别(进一步整理)