第一章:03从c语言到c++
代码运行环境
本节教程所有代码都是在win11系统,Qt 5.12.12版本,mingw编译工具环境编写运行。创建的工程类型为Qt Console Application。
1.引用
引用相当于给变量起一个别名,引用一般用于参数传递与返回值
变量有两个属性,一个是名称,一个是空间,引用只是具有变量名称属性的一个别名,与变量共享内存空间
定义引用的格式为:类型 &引用名 = 变量名
定义引用时一定要初始化,指明该引用变量是谁的别名
#include <QCoreApplication>
#include <iostream>
using namespace::std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int var = 100;
// int &revar; 这是一个错误写法,引用必须初始化
int &revar = var;
revar = 200;
cout << var << endl; //这里要注意,var的值由100变为了200
int var2 = 300;
revar = var2; //注意,这不是代表将revar作为var2变量的引用,而是将var2的值赋值给revar
cout << var << endl; //注意,var的值由200变为了300
return a.exec();
}
2.const引用
const引用是指向const对象的引用
#include <QCoreApplication>
#include <iostream>
using namespace::std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
const int var = 100;
// int &revar = var; 这是一个错误写法,const变量必须有const引用
const int &revar = var;
// revar = 200; 这是个错误写法,revar是const引用,不能再重新赋值
int var2 = 300;
const int& revar2 = var2; //这是可以的
// revar2 = 200; 这是错误的写法
//特别注意,当引用与被引用的变量类型不同,可能最终的结果不一致
//这并不与引用与变量共享内存这一特点矛盾
double var3 = 3.14;
//下面的写法等价于 int tmp = var3; const int& revar3 = tmp;
const int& revar3 = var3; //这种写法可以但是revar3 的值不等于var3
//int& revar4 = var3; 这种写法是错误的
return a.exec();
}
3.引用传递
本段代码主要是关于引用传递的内容
引用传递是在函数定义的时候,在形参前面加上&
在c语言中,学过值传递与指针传递,其中值传递,形参不能更改实参,指针传递则可以
c++中多了一种引用传递,可以实现形参对实参的变更
#include <QCoreApplication>
#include <iostream>
using namespace::std;
//参数引用
void swap(int &x, int &y) //使用引用传递
{
int temp = x;
x = y;
y = temp;
}
void swapn(int x, int y) //不使用引用传递
{
int temp = x;
x = y;
y = temp;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int aa = 5;
int bb = 6;
swap(aa, bb);
cout << aa << " " << bb << endl; //经过交换后,aa=6,bb=5
swapn(aa, bb);
cout << aa << " " << bb << endl; //aa=6,bb=5,没有发生交换
return a.exec();
}
4.引用作为函数返回值
引用传递还有作为函数返回值,这种用法可以将函数放在赋值运算符的左边
注意:引用变量的作用域很关键
当作为函数返回值的引用是全局变量,则不会出问题,但是如果是局部变量的引用则会出错
#include <QCoreApplication>
#include <iostream>
using namespace::std;
//返回引用1,在赋值语句的左边,要注意引用的变量的作用域
int arra[] = {1,2,3,4,5};
int & index(int i)
{
int arr[] = {1,2,3,4};
//return arr[i]; //这种是错误的,arr[]是局部变量,跳出函数后就消亡了。
return arra[i];
}
//返回应用2,在赋值语句的右边
int& add(int x, int y)
{
int sum;
sum = x + y;
return sum;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
index(3) = 100; //需要注意,index(3)是在函数执行完后,返回的过程中对引用进行了初始化
cout << arra[3] << endl;
//返回一个局部变量的引用,出错
int n2 = add(3,4);
cout << "n2= "<<n2 << endl; //输出为空,程序出错
int &nn2 = add(3,4);
cout << "nn2 = "<<nn2 << endl;
return a.exec();
}
5.引用与指针的区别
引用与指针的区别,引用访问变量是直接访问,指针是间接访问
引用一经初始化不能再引用其他变量,而指针可以。尽量使用引用,不得已用指针
引用是一个变量的别名,自身不占用内存空间,指针自身占用内存空间
#include <QCoreApplication>
#include <iostream>
using namespace::std;
//指针
int addpoin(int *x, int *y) //使用引用传递
{
return *x + *y;
}
int add(int x, int y) //不使用引用传递
{
return x + y;
}
//返回应用2,在赋值语句的右边
int * addP(int x, int y)
{
int sum;
sum = x + y;
return ∑
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int aa = 5;
int bb = 6;
int cc = addpoin(&aa, &bb);
cout << cc << endl;
return a.exec();
}