【C++ grammar】对象指针、对象数组、函数参数

目录

  • 1、Object Pointer & Dynamic Object
    • 1. Accessing Object Members via Pointers
    • 2. Creating Dynamic Objects on Heap
  • 2、Array of Objects
    • 声明方式
  • 3、Passing Objects to Functions
    • 1、Objects as Function Arguments (对象作为函数参数)
    • 2. Objects as Function Return Value(对象作为函数返回值)
    • 3. Objects Pointer as Function Return Value(对象指针作为函数返回值)
    • 4. Objects Reference as Function Return Value(对象引用作为函数返回值)

1、Object Pointer & Dynamic Object

1. Accessing Object Members via Pointers

Object pointers can be assigned new object names
Arrow operator -> : Using pointer to access object members

Circle circle1;
Circle* pCircle = &circle1; 
cout << "The radius is " << (*pCircle).radius    << endl;
cout << "The area is "   << (*pCircle).getArea() << endl;
(*pCircle).radius = 5.5;
cout << "The radius is " << pCircle->radius    << endl;
cout << "The area is "   << pCircle->getArea() << endl;

2. Creating Dynamic Objects on Heap

Object declared in a function is created in the stack, When the function returns, the object is destroyed 。
To retain the object, you may create it dynamically on the heap using the new operator.

Circle *pCircle1 = new Circle{}; //用无参构造函数创建对象
Circle *pCircle2 = new Circle{5.9}; //用有参构造函数创建对象
//程序结束时,动态对象会被销毁,或者
delete pObject;  //用delete显式销毁

2、Array of Objects

声明方式

1、

Circle ca1[10];

2、用匿名对象构成的列表初始化数组

Circle ca2[3] = { // 注意:不可以写成: auto ca2[3]=     因为声明数组时不能用autoCircle{3}, Circle{ }, Circle{5} };  

3、声明方式3
用C++11列表初始化,列表成员为隐式构造的匿名对象

Circle ca3[3] { 3.1, {}, 5 };
Circle ca4[3] = { 3.1, {}, 5 }; 

4、 声明方式4
用new在堆区生成对象数组

auto* p1 = new Circle[3];
auto p2 = new Circle[3]{ 3.1, {}, 5 };
//p1 p2都是指针,*在auto的时候会自动处理
delete [] p1;
delete [] p2;
p1 = p2 = nullptr;

上述代码第4行若是改为 delete [] p1,会发生什么情况?
在这里插入图片描述

3、Passing Objects to Functions

1、Objects as Function Arguments (对象作为函数参数)

You can pass objects by value or by reference. (对象作为函数参数,可以按值传递也可以按引用传递)

(1)     Objects as Function Return Value(对象作为函数参数)
// Pass by value
void print( Circle c ) {/* … */
}int main() {Circle myCircle(5.0);print( myCircle );/* … */
}

在这里插入图片描述

(2)     Objects Reference as Function Return Value(对象引用作为函数参数)
void print( Circle& c ) {/* … */
}int main() {Circle myCircle(5.0);print( myCircle );/* … */
} 

在这里插入图片描述

(3)     Objects Pointer as Function Return Value(对象指针作为函数参数)
// Pass by pointer
void print( Circle* c ) {/* … */
}int main() {Circle myCircle(5.0);print( &myCircle );/* … *、
}

在这里插入图片描述
在这里插入图片描述

2. Objects as Function Return Value(对象作为函数返回值)

// class Object { ... };
Object f ( /*函数形参*/ ){// Do somethingreturn Object(args);
}
// main() {
Object o = f ( /*实参*/ );
f( /*实参*/ ).memberFunction();

3. Objects Pointer as Function Return Value(对象指针作为函数返回值)

// class Object { ... };
Object* f ( Object* p, /*其它形参*/ ){// Do somethingreturn p;
}
// main() {
Object* o = f ( /*实参*/ );
// 不应该delete o

尽可能用const修饰函数返回值类型和参数除非你有特别的目的(使用移动语义等)。
const Object* f(const Object* p, /* 其它参数 */) { }

4. Objects Reference as Function Return Value(对象引用作为函数返回值)

// class Object { ... };
class X {Object o;Object f( /*实参*/ ){// Do somethingreturn o;}
}
可行的用法2
// class Object { ... };
Object& f ( Object& p, /*其它形参*/ ){// Do somethingreturn p;
}
// main() {
auto& o = f ( /*实参*/ );
f( /*实参*/ ).memberFunction();

用const修饰引用类型的函数返回值,除非你有特别目的(比如使用移动语义)
const Object& f( /* args */) { }
关于指针与引用的差别,请看这篇文章:
C++中引用和指针的区别

大概来讲:
1、因此如果你有一个变量是用于指向另一个对象,但是它可能为空,这时你应该使用指针;如果变量总是指向一个对象,i.e.,你的设计不允许变量为空,这时你应该使用引用。
2、引用不可以改变指向,但是指针可以改变指向,而指向其它对象。

#include<iostream>
using namespace std;
int main(int argc,char** argv)
{int i=10;int& ref=i;ref++;cout<<"i="<<i<<endl;cout<<"ref="<<ref<<endl;int j=20;ref=j;ref++;cout<<"i="<<i<<endl;cout<<"ref="<<ref<<endl;cout<<"j="<<j<<endl;return 0;
}

对ref的++操作是直接反应到所指变量之上,对引用变量ref重新赋值"ref=j",并不会改变ref的指向,它仍然指向的是i,而不是j。理所当然,这时对ref进行++操作不会影响到j。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java Date toString()方法与示例

日期类toString()方法 (Date Class toString() method) toString() method is available in java.util package. toString()方法在java.util包中可用。 toString() method is for string denotation of this Date object or in other words we can say it denotes date in a st…

十六、霍夫圆形检测

一、获取圆形检测原理 原图如下&#xff1a; 选取一个圆的任意点设定为圆形进行绘制圆形&#xff0c;交与一点 再将平面直角坐标系上的各点&#xff0c;通过公式转到极坐标上 很明显的看出较亮的点为圆心&#xff0c;然后通过半径进行绘制出圆。 二、实现步骤 由于霍夫圆检…

商务智能与交易系统的区别

商务智能与交易系统的区别 1、系统设计的区别 商务智能与交易系统之间的差异主要体现在系统设计和数据类型上&#xff08;见表 1.1 和表1.2&#xff09;。交易系统把结构强加于商务之上&#xff0c;不管谁来进行一项交易活动&#xff0c; 都会遵循同样的程序和规则&#xff0c;…

LeetCode 572. 另一个树的子树 思考分析

题目 给定两个非空二叉树 s 和 t&#xff0c;检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。 示例 1: 给定的树 s: 示例 2: 给定的树 s: 思路 思路&#xff1a;首先层序遍历s树…

2013.8.7Java语言基础——数组

数组是数据类型一致的变量的集合。 一个&#xff1a;变量 一堆&#xff08;多个&#xff09;&#xff1a;数组 数组语法&#xff1a; 1&#xff09;数组变量&#xff08;引用类型变量&#xff09; 数组变量通过引用地址引用了数组&#xff08;数组对象&#xff09; 2&#xff0…

ruby array_Ruby中带有示例的Array.select方法

ruby arrayArray.select方法 (Array.select Method) In the last articles, we have seen how to iterate over the instances of Array class? We have seen that we have got methods like Array.each, Array.reverse_each and Array.map for this purpose. In this article…

十七、轮廓发现

一、轮廓发现原理 轮廓发现是在图像边缘提取的基础上寻找对象轮廓的方法&#xff0c;故边缘提取的阈值的选定会影响到最终轮廓发现的结果。 其本质是基于二值图像的&#xff0c;边缘提取常用Canny进行提取边缘 轮廓发现也是基于拓扑结构&#xff0c;扫描连通图&#xff0c;最后…

关于 WebRequest.RegisterPrefix

RegisterPrefix 方法将 WebRequest 子代注册到服务请求。 WebRequest 后代通常被注册来处理特定的协议&#xff08;例如 HTTP 或 FTP&#xff09;&#xff0c;但也可能被注册来处理对特定服务器或服务器上的路径的请求。 已注册的预注册保留类型包括下列类型&#xff1a; htt…

LeetCode 404. 左叶子之和思考分析

题目 计算给定二叉树的所有左叶子之和。 如果是下面的树&#xff0c;只有一个左叶子结点4 思考分析 由此我们可以得到左叶子结点的定义&#xff1a; cur->left !NULL && cur->left->leftNULL && cur->left->rightNULL 递归遍历累积操作 …

天王盖地虎

1&#xff0c;求有序数列中某个元素的个数 思想&#xff1a;二分找上下界&#xff1a; int element_count(int * set, int len, int e) {int f, a, b, t;for(a 0, b len - 1; a < b; set[t a b >> 1] < e ? (a t 1) : (b t - 1));for(f a, b len - 1; a…

ruby array_Ruby中带有示例的Array.cycle()方法

ruby arrayArray.cycle()方法 (Array.cycle() Method) In this article, we will study about Array.cycle() method. You must be a little more excited to read about Array.cycle method due to its catchy name as I was pretty amazed after reading this method. In the…

十八、对已经找到轮廓的图像进行测量

图像轮廓的获取可参考博文十七 一、相关原理 1&#xff0c;弧长和面积 对于弧长和面积&#xff0c;计算出来的轮廓单位都是像素 2&#xff0c;多边形拟合 每一个轮廓都是一系列的点&#xff0c;然后通过多边形进行拟合&#xff0c;无限的接近真实形状 相关API&#xff1a;…

Linux 终端登录SSH:解决SSH的Access Denied 和 make xconfig的使用

对于SSH&#xff1a; 可以不是用putty&#xff0c;尤其是putty出现 Access denied 的时候&#xff0c;请换用konsole 或者其他终端 &#xff08;如 terminal&#xff09;在command line中&#xff1a; # ssh 要访问的主机ip eg &#xff1a; ssh 192.168.111 然后确定…

LeetCode 513. 找树左下角的值 思考分析

题目 给定一个二叉树&#xff0c;在树的最后一行找到最左边的值。 递归解 左下角要满足两个条件&#xff1a; 1、深度最大的叶子结点 2、最左结点&#xff1a;使用前序遍历&#xff0c;优先左边搜索。 1、确定递归函数的参数和返回值 参数&#xff1a;树的根结点&#xff…

利用MyBatis的动态SQL特性抽象统一SQL查询接口

1. SQL查询的统一抽象 MyBatis制动动态SQL的构造,利用动态SQL和自定义的参数Bean抽象,可以将绝大部分SQL查询抽象为一个统一接口,查询参数使用一个自定义bean继承Map,使用映射的方法构造多查询参数.在遇到多属性参数(例如order by,其参数包括列名,升序降序类型,以及可以多个列及…

ctype函数_PHP Ctype(字符类型)函数

ctype函数Ctype功能 (Ctype functions) PHP provides some of the built-in functions, which are used to verify the characters in the string i.e. to check whether a string contains the characters of specific types. PHP提供了一些内置函数&#xff0c;这些函数用于验…

Linux 平台下 MySQL 5.5 安装 说明 与 示例

一.下载说明前期的一些准备说明&#xff0c;参考&#xff1a;MySQL 发展史http://blog.csdn.net/tianlesoftware/article/details/6999245Mysql 不同版本 说明http://blog.csdn.net/tianlesoftware/article/details/6723117 MySQL 分为Community Server 和 Enterprise Edition。…

开始python之旅

接触python缘于工作所需&#xff0c;曾经接触过C、C等语言&#xff0c;对于编程语言在学习上大体是一个套路&#xff0c;当然套路因人而异&#xff0c;适合就好。接下来&#xff0c;我将不断分享python的知识和学习技巧&#xff0c;共同学习。 起源 初识一门语言善于先了解语言…

LeetCode 112. 路径总和 、113. 路径总和 II 思考分析

目录112. 路径总和题目递归解递归解&#xff0c;其他人的解法迭代解&#xff0c;其他人的解法113. 路径总和 II题目递归解递归解&#xff0c;参考别人的思路112. 路径总和 题目 给定一个二叉树和一个目标和&#xff0c;判断该树中是否存在根节点到叶子节点的路径&#xff0c;…

kotlin 查找id_Kotlin程序查找矩阵的转置

kotlin 查找idA transpose of a matrix is simply a flipped version of the original matrix. We can transpose a matrix by switching its rows with its columns 矩阵的转置只是原始矩阵的翻转形式。 我们可以通过切换矩阵的行和列来转置矩阵 Given a matrix, we have to…