第一章: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 &sum;
}

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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值