首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++C++ 引用详解 ④ ( 函数返回 静态变量 全局变量 引用 指针 )

一、函数返回 静态变量 / 全局变量 引用 / 指针 1、函数返回局部变量引用或指针无意义 上一篇博客 【C++C++ 引用详解 ③ ( 函数返回值不能是 “ 局部变量 “ 引用或指针 | 函数内..., 相应 局部变量 地址 也有没有了意义 , 此时 , 再持有一个 函数返回 没有意义 引用 / 指针 , 取出值是随机无意义值 ; 2、函数返回静态变量/全局变量引用或指针 函数 返回是..." 静态变量 " 或 " 全局变量 " 引用 / 指针 时 , 是可以 ; 如果 函数 返回值 是 静态变量 或 全局变量 引用 , 这两种变量 一旦分配内存后 , 在整个程序生命周期中..., 该内存都不会被回收 , 返回它们 引用 / 指针 , 可以正常访问 对应 内存中数据 ; 3、代码示例 - 函数返回静态变量/全局变量引用或指针 在下面的代码中 , fun 函数作为 参照...; 使用 引用 接收 fun2 函数返回引用 , 获取是静态变量引用地址 , 该引用对应内存一直是有效 , 因此可以通过该引用获取到内存中正确 静态变量值 ; 代码示例 : // 导入标准

17930

C++常见问题(二)——虚函数、与结构、引用与值传递

一 文件输入输出方式 C++定义了ifsteam、ofstream和fstream 3种类型以用来支持文件输入输出。...或public,在基定义中定义虚函数形式为: virtual 函数返回值类型 虚函数名(形参表) { 函数体 } 纯虚函数是一种特殊虚函数,一般格式: class {...virtual ()=0; } 六 引用与值传递区别 值传递将要传递值作为一个副本传递,在函数调用时,实参把它传递给对应形参,方法执行中实参值不会发生改变..."<<n<<endl; //输出结果为n = 0 void Func2(int &x) { x = x + 10; } int n = 0; Func2(n); //引用传递...cout<<"n="<<n<<endl; //输出结果为n = 10 七 <em>类</em>和结构有什么区别 <em>类</em>定义<em>的</em>一般形式: class Name { public: <em>类</em><em>的</em>共有接口

86260
您找到你想要的搜索结果了吗?
是的
没有找到

C++引用与const指针关系以及各种传递方式

其实引用底层就是用const指针来实现。...(name mangling),而const 引用如 const int & 呢我们也可以类比为  const int * const p 即既不能成为别的变量引用,也不能通过引用更改变量值。...引用经常作为函数参数传递,可以与值传递,以及指针传递做个比较: 值传递: 实参初始化形参时要分配空间, 将实参内容拷贝到形参 引用传递: 实参初始化形参时不分配空间 指针传递:本质是值传递,但如果我们要修改指针本身...见到不一定是真的啊,不要被它欺骗了,这就是返回局部变量引用后果。...其实函数返回是局部变量sum引用,而 n2 本身又是引用,即引用着原来sum 拥有的那块区域,第一次打印没有出错是因为本来写在sum 区域上值11 尚未被覆盖,而再运行两条打印语句后再次打印,很可能原来属于

75970

Java——引用传递实例分析(进阶分析、对象比较、关联实现)

1、引用传递进阶分析 引用传递是Java精髓所在,也是初学者比较难学地方。下面通过三个程序进行分析。...引用传递一定要耐心使用内存分析,String这种类型 数据需要进行特殊处理。...3、引用传递实际应用 程序是生活抽象,日常生活中概念实际都可以用程序描述,eg:一个人有一辆车。 描述以上概念前,有这样一个对比,若现在进行数据库设计,若描述以上操作形式,数据库表该如何设计?...; 表外键关系 = 引用设置; 所以,正是因为有这样匹配关系,所以在实际开发中,简单java不是凭空设计,往往要与数据表结构一一对应。...4、总结 不要把程序当成纯粹程序; 引用传递除了进行数据分析外,还要掌握联系使用; 代码链使用必须掌握

89720

c++中两个互相引用问题

最近在改一个C++程序时候碰到一条警告信息,警告信息为:“                 删除指向不完整“Q2DTorusNode”类型指针;没有调用析构函数                ...解决方案: 此种状况解决利用前置声明定义那个保持另外一个引用定义为指针,定义指针时不需要对那个定义可见。...“warning C4150: 删除指向不完整“B”类型指针;没有调用析构函数”       而且另外一个问题是在该.h文件中不能使用该指针调用这个成员,原因也是定义不可见。                ...“error C2227: “->haha”左边必须指向/结构/联合/泛型类型” 解决方案:       此时需要将A.h所有成员函数实现重新定义一个.cpp文件,然后该.cpp文件去#include...指针成员头文件声明,此时定义可见,即可定义析构函数,调用指针成员了。

1.2K20

c++中两个互相引用问题

最近在改一个C++程序时候碰到一条警告信息,警告信息为:“                 删除指向不完整“Q2DTorusNode”类型指针;没有调用析构函数                ...解决方案: 此种状况解决利用前置声明定义那个保持另外一个引用定义为指针,定义指针时不需要对那个定义可见。...“warning C4150: 删除指向不完整“B”类型指针;没有调用析构函数”       而且另外一个问题是在该.h文件中不能使用该指针调用这个成员,原因也是定义不可见。                ...“error C2227: “->haha”左边必须指向/结构/联合/泛型类型” 解决方案:       此时需要将A.h所有成员函数实现重新定义一个.cpp文件,然后该.cpp文件去#include...指针成员头文件声明,此时定义可见,即可定义析构函数,调用指针成员了。

1.2K20

c++中两个互相引用问题

最近在改一个C++程序时候碰到一条警告信息,警告信息为:“                 删除指向不完整“Q2DTorusNode”类型指针;没有调用析构函数                ...解决方案: 此种状况解决利用前置声明定义那个保持另外一个引用定义为指针,定义指针时不需要对那个定义可见。...“warning C4150: 删除指向不完整“B”类型指针;没有调用析构函数”       而且另外一个问题是在该.h文件中不能使用该指针调用这个成员,原因也是定义不可见。                ...“error C2227: “->haha”左边必须指向/结构/联合/泛型类型” 解决方案:       此时需要将A.h所有成员函数实现重新定义一个.cpp文件,然后该.cpp文件去#include...指针成员头文件声明,此时定义可见,即可定义析构函数,调用指针成员了。

1.8K50

C++ 不同构造与三种引用

引言 C++也是支持面向对象语言,也有概念。与java差异比较大是,没有gc(垃圾回收器),所以设计要考虑好释放,不过也提供了智能指针(自动计数引用,自动释放)。...这时要使用变量原有的类型作为引用传递,需要通过std::forward来实现,std::forward函数使用变量自身引用类型作为值去传递(底层使用static_cast强制转化),此时就会分别调用右值...然后比较大区别的是,c++默认不写访问权限是private,java是default。还有就是,C++没有访问权限修饰符,把对父访问权限放到了子类继承方式上。...共享成员与对象成员 共享成员是一个被全部对象共享成员,即全局、静态、非对象独有的。像是java一样,cpp也有静态成员,但是这里用了共享成员,因为他还有另一种替代品——枚举。...这里我们先不探究左值引用这些问题,其与普通Yyt another区别在于,普通方法形参接收对象,实际也会走浅拷贝,而通过引用方式,则不会,直接传递真实对象 class Yyt{ public

2.2K10

C++封装 ② ( 封装最基本表层概念 | 对象作为参数传递几种情况 )

( 指针 / 引用 / 直接 ) 使用 对象 作为函数参数时 , 分别讨论下面三种情况 ; 第一种情况 : 使用 对象 指针作为参数 , 传参时 , 传入必须是一个指针值 , 也就是地址值 ,...: 使用 对象引用作为 参数 ; 传参时 , 可以直接将 circle 对象传入 , 因为 C++ 编译器在编译引用时 , 会自动为 引用参数 添加 & 取地址 , 在函数内部访问时 , 会自动为引用添加...) : " << circle.getS() << endl; } Circle circle; // 传递引用直接传递即可 fun2(circle); 第三种情况 : 直接使用 对象作为参数 ,...这种情况下 , 需要拷贝整个对象作为副本 , 函数调用效率很低 , 不建议使用这种方式 , 该调用方式与 引用 类型参数操作相同 , 推荐使用 引用类型参数 ; // 直接使用 对象作为参数 void...fun1(&circle); // 传递引用直接传递即可 fun2(circle); // 传递对象直接传递 , 需要拷贝整个对象效率很低 fun3(circle); // 控制台暂停

23610

C++C++ this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

一、全局函数 与 成员函数 相互转化 1、成员函数转为全局函数 - 多了一个参数 C++ 编译器 , 在编译阶段会将 C++ 成员函数 转为 全局函数 , 转换时 , 会 增加一个参数到参数列表开始为止..., 这个增加参数是 对象本身指针 ; 在 Student 中 , 定义了如下函数 : // 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数 void...就是 左操作数 , 在成员函数中 , 通过 this 指针访问对象本身成员 ; 在全局函数中 , 实现两个 Student 相加 , 接收两个 Student 引用类型参数 , 引用相当于一级指针...; // 全局函数中 , 将两个 Student 对象相加 // 引用 等同于 一级指针 , Student 引用用法与 Student 对象用法相同 // 全局函数 转为 成员函数 , 少了一个参数..., 将两个 Student 对象相加 // 引用 等同于 一级指针 , Student 引用用法与 Student 对象用法相同 // 全局函数 转为 成员函数 , 少了一个参数 Student StudentPlus

17920

C++核心准则​Con.3:默认情况下,传递参照常量指针或引用

秋英 Con.3: By default, pass pointers and references to consts Con.3:默认情况下,传递参照常量指针或引用 Reason(原因) To...为了避免被调用函数意外修改变量值。当被调用函数不会修改状态时这么做会使程序理解更加容易。...将指针或者参照传递给非常量也不是就一定不好,但是最好只有在被调用函数会修改对象时这么做。...an object passed by pointer or reference to non-const 如果函数没有修改非常量指针或引用参照对象,标记它。...that (using a cast) modifies an object passed by pointer or reference to const 如果函数使用const类型转换修改常量指针或引用参照对象

40330

值传参、指针传参、引用传参区别

在C中,我们只了解到有两种传参方式,一种是值传递,另外一种是传递指针,一般情况下我们选择使用指针传递参数。在C++中,又新增了一种传参方式,那就是引用(type &),引用传参给我们带来了更好体验。...而且在函数生命周期结束后,会随函数一起消失,如不作为返回值是无法传出。...并且在函数内部还可以通过指针修改指针指向地址中数据以作为传出数据作用。 3、引用传递 引用作为一个变量别名,相当于一段内存引用。...在传递给函数时相当于包装了原变量指针地址传递给函数,可以理解为在函数中直接使用原变量进行操作,而且这个期间不会出现拷贝行为。引用本质是指针,C++对裸露内存地址(指针)作了一次包装。...又取得指针优良特性。所以再对引用取地址,建立引用指针没有意义。

18140

CC++面试题之语言基础篇(一)

对于C++全局或静态对象对象首次用到时才进行构造。 静态局部变量,全局变量,局部变量特点 首先从作用域考虑: 全局变量:全局作用域,可以通过extern作用于其他非定义源文件。...传参方式有这三种:值传递引用传递、指针传递传递:形参即使在函数体内值发生变化,也不会影响实参值; void foo(int x) { x = x * 2; // 修改是副本,不会影响原始数据...它通常以引用参数传递另一个对象。...,其参数是与它同属一对象(常)引用;定义中,如果未提供自己拷贝构造函数,C++提供一个默认拷贝构造函数,该默认拷贝构造函数完成一个成员到一个成员拷贝,属于浅拷贝 深拷贝和浅拷贝区别 浅拷贝...右值引用赋值表达式结束后对象会被销毁 左值引用后可以利用别名修改左值对象;右值引用绑定值不能修改 目的 左值引用目的是为了传递和操纵数据 右值引用目的是为了实现完美转发(传递参数数据类型+左右值属性

19110

C++】运算符重载 ② ( 内部定义云算符重载 - 成员函数 | 外部定义运算符重载 - 全局函数 | 可重载运算符 )

一、运算符重载本质 运算符重载本质是 " 函数调用 " ; 当使用 + 将 个对象相加时 , C++ 编译器会查找是否有定义运算符重载函数 ; // 自定义类型相加 Student s1(10,...二、运算符重载语法 - 内部定义云算符重载 ( 成员函数 ) 1、运算符重载函数语法说明 C++ 中允许重新定义运算符行为 , 如常用加减成熟运算符 , 都可以进行重载操作 ; 可以自定义运算符操作...; 内部定义云算符重载 , 格式为 “返回值类型 ( 名称 ) operator运算符符号 ( const 参数类型名称& 参数变量名称 ) { 方法内容 }” , 参数类型是引用类型 ;..., 可以使用函数形式调用 , 也可以使用运算符进行运算 , 其 本质还是函数调用 ; 2、运算符重载函数调用 重载运算符完整调用 , 即调用上面定义整个 operator+ 方法 , 这是采用正式函数调用方式...( 全局函数 ) ---- 1、运算符重载函数语法说明 外部定义运算符重载 , 运算符重载也可以定义在外部 , 可以是任意包含头文件代码中 , 其定义方式与定义在内部对比 , 只有参数是有区别的

21110

C++笔试面试题整理

这就是说,你能用dynamic_cast把指向基指针或引用转换成指向其派生或其兄弟指针或引用,而且你能知道转换是否成功。...const修饰函数形式参数:当输入参数为用户自定义类型和抽象数据类型时,将“值传递”改为“const&传递”可以提高效率。...另外,函数中"adgfdf"这样字符串存放在常量区。 ? 在什么时候需要使用“常引用”? 如果既要利用引用提高程序效率,又要保护传递给函数数据不在函数中被改变,就应使用常引用。...(3)可以返回成员引用,但最好是const。这条原则可以参照Effective C++[1]Item 30。...在什么时候需要使用“常引用”? 如果既要利用引用提高程序效率,又要保护传递给函数数据不在函数中被改变,就应使用常引用。 什么函数不能声明为虚函数?

2.5K30

内存、引用、封装、函数

只需要在内存中有一份代码即可代码区是只读,防止程序意外修改了它指令全局区:存放全局变量、静态变量(static)和常量(字符串常量、const修饰全局变量)int* test()//形参也会存放在栈区...<< "b=" << b << endl;//100 return 0;}<em>引用</em><em>引用</em>作函数参数作用:函数传参时,可以利用<em>引用</em><em>的</em>技术让形参修饰实参优点:可以简化指针 修改实参//<em>引用</em><em>传递</em>void test2...cout << "a=" << a << endl;//20 cout << "b=" << b << endl;//10 return 0;}通过<em>引用</em>参数产生<em>的</em>效果和地址<em>传递</em>是一样<em>的</em>...,<em>引用</em><em>的</em>语法更清楚简单<em>引用</em>作函数返回值不要返回局部变量<em>引用</em>int& test(){ //静态变量存放在<em>全局</em>区,程序结束时由系统释放 static int a = 10; return...+面向对象<em>的</em>三大特性:封装、继承、多态<em>C++</em>认为万事万物皆为对象,对象上有其属性和行为具有相同性质<em>的</em>对象,我们可以抽象成为<em>类</em>,人属于人类,车属于车<em>类</em>封装封装<em>的</em>意义将属性和行为作为一个整体,表现生活中<em>的</em>事物

74600

C++程序员经常问11个问题

另外,输入输出流C++标准 规范接口在一些微妙细节上都已改进,因此,和在接口和执行上都是不同。最后, 各组成都是以STL形式声明,然而各组成都是声明成全局。   ...要点2:用引用传递参数时应注意地方   在用引用传递参数时,最好把引用声明为const类型。这样做好处是:告诉程序不能修改这个参数。...在下面的这个例子中函数f()就是传递引用: void f(const int & i); int main() {  f(2); /* OK */ }    这个程序传递一个参数2给f()...在运行时,C++创建一个值为2int类型临时变量,并传递引用给f().这个临时变量和它引用从f()被 调用开始被创建并存在直到函数返回。返回时,就被马上删除。...当你公有继承创建一个从基继承相关时,指向新对象中指针和引用实际上都指向了起源对 象。因为析构函数不是虚函数,所以当你delete一个这样时,C++就不会调用析构函数链。

84320

std::function与std::bind使用总结

C++中函数指针用途非常广泛,例如回调函数,接口设计等,但函数指针始终不太灵活,它只能指向全局或静态函数,对于成员函数、lambda表达式或其他可调用对象就无能为力了,因此,C++11推出了std...,但是它只能指向全局或静态函数,这有点太不灵活了,而且我们都知道在C/C++中,全局东西都很可怕,稍有不慎就会被篡改或随便调用。...std::function可以说是函数指针超集,它除了可以指向全局和静态函数,还可以指向彷函数,lambda表达式,成员函数,甚至函数签名不一致函数,可以说几乎所有可以调用对象都可以当做std:...& 匿名函数内所用到外部变量都按引用传递 &, a, b 匿名函数内除了a和b是按值传递,其他变量都是按引用传递 =, &a, &b 匿名函数内除了a和b是按引用传递,其他变量都是按值传递 a, &...b 匿名函数只捕获了a和b两个外部变量,其中a是按值传递,b是按引用传递 圆括号内是匿名函数所需要参数,也可以分为按值传递和按引用传递两种方式,某种意义上说,方括号中捕获外部变量其实也可以作为参数传入

10.8K92

【Android NDK 开发】JNI 引用 ( 局部引用 | 局部引用作用域 | 局部引用产生 | 局部引用释放 | 代码示例)

规律 : 除 八种 基本数据类型之外都是引用数据类型 ; ② 都是 Java 引用数据类型 : 这些数据类型都是 C/C++ 中定义 Java 引用数据类型 , 其本质是 C/C++ 环境中对应...JNI 引用类型分为三 : ① 局部引用 : 其只在作用域内有效 , 内存不可回收 ; ② 全局引用 : 全局有效 , 内存不可回收 ; ③ 全局引用 : 全局有效 , 内存不足时会被 JVM 回收...JNI 引用 与 指针 ---- 在 JNI 中一定要将 引用 和 指针 区分开 ; 引用 是 Java 语言中概念 , 指针 是 C/C++概念 ; JNI 中 Java 引用类型 也是使用...C/C++ 指针表示 , 这个 变量 就有了 两重含义 , 即代表 Java 中引用类型 , 又代表了 编程环境中 指针 ; 这里注意 , 如果引用被 JVM 释放了 , 即使指针还有值 , 也是不能用于..., 那么可以不进行手动释放 ; 建议用法 : 局部引用建议都要手动释放 , 哪怕是在作用域最后 , 也要进行手动释放 局部引用传递到 Java 层 , 该传递是拷贝传递

57520

【专业技术】你必须注意11个C++要点

要点2:用引用传递参数时应注意地方 在用引用传递参数时,最好把引用声明为const类型。这样做好处是:告诉程序不能修改这个参数。...在下面的这个例子中函数f()就是传递引用: void f(const int & i); int main() { f(2); /* OK */ } 这个程序传递一个参数2给f()。...在运行时,C++创建一个值为2int类型临时变量,并传递引用给f().这个临时变量和它引用从f()被调用开始被创建并存在直到函数返回。返回时,就被马上删除。...你可以给临时对象也加上引用如果是const类型: struct A{}; void f(const A& a); int main() { f(A()); // OK,传递是一个临时Aconst引用...当你公有继承创建一个从基继承相关时,指向新对象中指针和引用实际上都指向了起源对象。因为析构函数不是虚函数,所以当你delete一个这样时,C++就不会调用析构函数链。

97150
领券