C++ 引用做左值

//引用做左值
#include<iostream>

using namespace std;

int SetA(int *p){
    *p = 30;
    return *p;
}

int& SetB(int *p){
    *p = 20;
    return *p;
}

void main(){
    int a1 = 0;
    //SetA(&a1) = 100;
    //报错  error C2106: “=”: 左操作数必须为左值
    //SetA(&a1)的运算结果是一个数值 没有内存地址  不能当左值
    //30=100;是错误的

    SetB(&a1) = 100;
    printf("a1=%d\n",a1);//打印 a1=100;
    //详解  由上一篇  引用的本质  可知SetB(&a1) 返回的是一个  引用指针
    //当引用做左值时,c++编译器会默认执行 提领 * 操作
    //即*p=100;  这是符合语法规范的
    system("pause");
}

时间: 2024-08-08 13:57:59

C++ 引用做左值的相关文章

引用参数与引用返回值 类的拷贝构造

引用地址  http://www.cnblogs.com/bigshow/archive/2008/11/10/1330514.html 经常看到这样的声明:T& func(T& t),这种声明和T func(T t)有什么区别?书上的解释是为了提高效率,究竟是如何提高效率的呢?内部执行了什么操作?本文通过8个小例子对引用参数和引用返回进行了一次彻底的排查.    首先看一下在类的成员函数中的引用参数和引用返回值: 类定义class A{     public:      int x; A

【C++】C++引用返回值需谨慎

源地址 http://onlywish.me 引用不像指针那么复杂,又不拷贝空间,一直比较喜欢它. 于是深入探究C++引用的问题 殊不知,不知道引用返回值的使用方式有很大的风险 基础: 当对象进行值传递时.会调用类的拷贝构造函,常见的,函数形参.=号赋值. 我进行了如下的实验: 有一个函数 定义如下: A & func(); 返回一个类的引用 原来,我都是这样调用的. A a = func();我相信大部分人都是这么调用 经过实验发现,这样会调用一次拷贝构造函数 其实是把返回值返回了一个引用到栈

用引用返回值

函数返回值时,要生成一个值的副本.而用引用返回值时,不生成值的副本. 例如,下面的程序是有关引用返回的4种形式: //********************* //** ch9_6.cpp ** //********************* #include <iostream.h> float temp; float fn1(float r) { temp = r*r*3.14; return temp; } float& fn2(float r) { temp = r*r*3.

指针和引用、值传递和引用传递

1.指针和引用 指针是一个变量,它存储的是内存地址:引用和原来的变量是同一个,对引用修改会改变原变量,而修改指针只是修改了指向的内存 可以有const指针.但是没有const引用:指针可以多级int **p;引用只有1级 int &&p不合法 指针可空,引用必须初始化:指针可以修改,可以指向别的变量:引用不能修改,只能是那个变量的引用 2.值传递和引用传递 值传递,会创建变量的一个临时副本,对它修改不会改变原变量 引用传递,因为引用是原变量的一个别名,对引用修改会改变原值 指针作为函数参数

HTML 属性常用引用属性值和 标签参考手册

HTML 属性:属性是为 HTML 元素提供的附加信息. HTML 元素可以设置属性 属性可以在元素中添加附加信息 属性一般描述于开始标签 属性总是以名称/值对的形式出现,比如:name="value". e.g:<a href=https://www.cnblogs.com/dhnblog/">这是一个链接</a> HTML 链接由 <a> 标签定义.链接的地址在 href 属性中指定 HTML 属性常用引用属性值 属性值应该始终被包括在

引用参数,引用返回值

函数形参诗引用,程序输出如程序最后的注释,表明引用s代表的是对象s2. //函数中的引用 #include<iostream> using namespace std; class Sample { int x; public: Sample(int a): x(a) { cout<<"call constructor Sample(int a)"<<endl; } Sample(Sample &a): x(a.x) { cout <&

为什么(i++)不能做左值,而(++i)可以

int i = 0; int *ip = &(i++); //错误 int *ip = &(++i); //正确 看到上面的语句,当时以为两个都是是对的啊,可是当我用VS2010的编译器试了试之后,才发现第一个取地址确实是错误的语句,具体的提示是:error C2102: “&”要求左值,而第二个取地址是正确的. 也就是说取地址符"&"作用的对象必须是一个左值,左值的概念是什么呢?看一下百度对于C/C++中左值的定义: 左值: C/C++语言中可以放在赋

引用传递&amp;值传递

下面的程序阐述了值传递与应用传递的区别. package com.liaojianya.chapter1; /** * This program demonstrates the use of array reference. * @author LIAO JIANYA * 2016年7月21日 */ public class ArrayReference { public static void main(String[] args) { int x = 100; int arr[] = {1

关于C#编程中引用与值类型赋值的一些容易犯错的地方

值类型与引用类型的区别在于:值类型在赋值的时候是拷贝值,引用类型在赋值的时候的拷贝引用.记住这一个原则,我们再来分析一些具体情况: 1 PointStruct pt1 = new PointStruct(2,2); 2 PointStruct pt2 = pt1; 3 PointStruct[] ptsArray = new PointStruct[3]; 4 ptsArray[0] = pt1; 5 ptsArray[1] = pt2; 6 List<PointStruct> ptsList