c++-引用
2019-12-20 16:01:59来源:博客园 阅读 ()
c++-引用
c++中引用类型,引用是如何引用的呢?
- 引用
- 引用概念,给变量起个别名,本质是给内存空间取个别名
- 引用是c++的语法概念、引用的意义(好用)
- 引用本质:有地址、定义时必须初始化,c++编译器内部按照指针常量
- 引用结论:间接赋值成立的三个条件的后两步和二为一
- 引用使用原则:当用引用时,我们不去关心编译器引用是怎么做的;当分析奇怪的语法现象时,才去考虑c++编译器是怎么做的
- 函数返回值是引用(若返回栈变量,不能成为其他引用的初始化)
- 函数返回值当左值,必须返回一个引用
- 指针的引用int getT(Teacher * &myp )
- 常引用
- 用变量初始化const引用,然变量形参拥有只读属性
- 用字面量初始化const引用,额外的分配内存空间
- 引用概念,给变量起个别名,本质是给内存空间取个别名
- 引用是c++的语法概念、引用的意义(好用)
- 引用本质:有地址、定义时必须初始化,c++编译器内部按照指针常量
- 引用结论:间接赋值成立的三个条件的后两步和二为一
- 引用使用原则:当用引用时,我们不去关心编译器引用是怎么做的;当分析奇怪的语法现象时,才去考虑c++编译器是怎么做的
- 函数返回值是引用(若返回栈变量,不能成为其他引用的初始化)
- 函数返回值当左值,必须返回一个引用
- 指针的引用int getT(Teacher * &myp )
- 常引用
_ 用变量初始化const引用,然变量形参拥有只读属性
_ 用字面量初始化const引用,额外的分配内存空间
这与c大有不同
1 引用没有定义, 是一种关系型声明。声明它和原有某一变量(实体)的关
系。故 而类型与原类型保持一致, 且不分配内存。与被引用的变量有相同的地
址。
2 声明的时候必须初始化, 一经声明, 不可变更。
3 可对引用, 再次引用。多次引用的结果, 是某一变量具有多个别名。
4 & 符号前有数据类型时, 是引用。其它皆为取地址
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
/*
*/
void change_value(int *p) // int p = a;
{
*p = 30;
}
void change_value2(int & r)//int &r = a
{
r = 30; //a = 30
}
int main(void)
{
int a = 20;
int b = 30;
int *p = &a;
*p = 30;
p = &b;
*p = 20;//b
int &re = a; //int & 使用引用数据类型, re就是a的别名
re = 50;
&re;
&a;
re = b; //让re成为b的引用? a = b
re = 50;
cout << "a =" <<a << endl;
cout << "b = " << b << endl;
int & re2 = b; //引用一定要初始化,
re2 = a;
int &re3 = re;
re3 = 100;
cout << "a =" << a << endl;
cout << "re =" << re << endl;
cout << "re3 =" << re3 << endl;
cout << "-------------" << endl;
cout << "a =" << a << endl;
change_value(&a);//改变了值
cout << "a =" << a << endl;
a = 100;
cout << "-------------" << endl;
cout << "a =" << a << endl;
change_value2(a);//改变了值
cout << "a =" << a << endl;
return 0;
}
引用示例
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
struct student
{
int id;
char name[64];
};
void my_swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void my_swap2(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
void printS(struct student s) //student s = s1; 结构体整个值拷贝的动作
{
cout << s.id <<" "<< s.name << endl;
s.id = 100;
}
void printS1(struct student *sp)
{
cout << sp->id << " " << sp->name << endl;
sp->id = 100;
}
//引用在一定条件下能够取代指针的工作,也能作为函数参数。
void printS2(struct student &s)//student &s = s1;
{
cout << s.id << " " << s.name << endl;
s.id = 300;
}
int main(void)
{
int a = 10;
int b = 20;
my_swap2(a, b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
student s1 = { 10, "zhang3" };
printS(s1);
printS1(&s1);
printS2(s1);
cout << "si.id =" << s1.id << endl;
return 0;
}
引用的本质
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
struct typeA
{
int &a;
};
struct typeB
{
int *a;
};
struct student
{
int id;
char name[64];
};
void motify(int *const a)//int *const a = main::&a
{
*a = 300;
}
void motify2(int &a) //当我们将引用作为函数参数传递的时候,编译器,会替我们将实参,取地址给引用
//int &a = main::&a
{
a = 300; //对一个引用操作 赋值的时候,编译器提我们隐藏*操作。
}
//如果我们在去研究引用的时候,你可以将引用当做一个常指针去研究
//当你在使用引用编程的时候,你就把引用理解为变量的别名就可以了。
int main(void)
{
cout << "sizeof(struct typeA)" << sizeof(struct typeA) << endl;
cout << "sizeof(struct typeB)" << sizeof(struct typeB) << endl;
//引用所占用的大小 跟指针是相等的。
int a = 10;
int &re = a; //常量要初始化,引用也要初始化, 引用可能是一刚常量。
int *const p = &a;
//综上两点, 引用 可能是一个常指针。
motify(&a);
motify2(a);
return 0;
}
引用作为函数的返回值
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
char * getmem(int num)
{
char *p = NULL;
p = (char*)malloc(num);//分配空间
return p;//ox11223344
}//0x1231321
int getmem2(char **pp, int num)
{
char *p = NULL;
p = (char*)malloc(num);
*pp = p;
return 0;
}//0
int getA1()
{
int a = 10;
return a;
}//a的值
void getA2(int *a)
{
*a = 10;
}
//引用作为返回值,不要返回局部变量的引用。
int& getA3()
{
int a = 10;
return a;
}//int &temp = a;
int &getA4()
{
static int a = 10;
return a;
}
int main(void)
{
int a = 0;
char *pp = NULL;
a = getA1();
pp = getmem(10);
cout << "-----------" << endl;
int main_a = 0;
main_a = getA3(); //main_a = temp; //数值拷贝
cout << "main_a " << main_a << endl;
cout << "-----------" << endl;
#if 0
int &main_a_re = getA3();
cout << "main_a_re " << main_a_re << endl;
cout << "main_a_re " << main_a_re << endl;
#endif
int &main_a_re = getA4();
cout << "main_a_re " << main_a_re << endl;
cout << "main_a_re " << main_a_re << endl;
//引用如果当函数返回值的话,函数可以当左值。
getA4() = 1000;
return 0;
}
指针引用
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
struct teacher
{
int id;
char name[64];
};
int get_mem(struct teacher** tpp)
{
struct teacher *tp = NULL;
tp = (struct teacher*) malloc(sizeof(struct teacher));
if (tp == NULL) {
return -1;
}
tp->id = 100;
strcpy(tp->name, "li4");
*tpp = tp;
return 0;
}
void free_teacher(struct teacher **tpp)
{
if (tpp == NULL) {
return;
}
struct teacher *tp = *tpp;
if (tp != NULL) {
free(tp);
*tpp = NULL;
}
}
int get_mem2(struct teacher* &tp)
{
tp = (struct teacher*)malloc(sizeof(struct teacher));
if (tp == NULL) {
return -1;
}
tp->id = 300;
strcpy(tp->name, "wang5");
return 0;
}
void free_mem2(struct teacher * &tp)
{
if (tp != NULL) {
free(tp);
tp = NULL;
}
}
int main(void)
{
struct teacher *tp = NULL;
get_mem(&tp);
cout << "id =" << tp->id << ", name = " << tp->name << endl;
free_teacher(&tp);
cout << "00000000000" << endl;
get_mem2(tp);
cout << "id =" << tp->id << ", name = " << tp->name << endl;
free_mem2(tp);
return 0;
}
原文链接:https://www.cnblogs.com/ygjzs/p/12074403.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:c++-const
- 透彻理解C++11新特性:右值引用、std::move、std::forward 2020-04-30
- 引用传参与reference_wrapper 2020-04-21
- 模板参数的“右值引用”是转发引用 2020-04-19
- 第一章 从C到C++ 2020-04-04
- const与指针、引用 2020-02-25
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash