对象做函数参数和函数返回值时,调用复制构造函数,构造函数,析构函数的情况

// 对象做函数参数和返回值.cpp : 定义控制台应用程序的入口点。
//exit(0)表示正常退出程序,exit(0)表示异常退出

//在调用input时,编译器用对象A去创建了形参对象temp,调用了复制构造函数,对象A中的数据复制给了对象temp
// 在input函数中,执行temp.set(s),为对象temp中数据成员str申请了动态储存空间,并设置了输入的字符串
//并没有改变实参A中的数据成员str的储存空间,故在执行语句A.show()后输出的字符串并没有改变。在函数调用结束后
//将对象temp做为函数返回值来创建对象B,所以对象B的数据成员str的值是调用input函数时输入的字符串

#include<iostream>
#include<cstring>
using namespace std;
class Cstream
{
public:
Cstream(char *s);
Cstream(const Cstream& temp);//copy constructor function
~Cstream();
void show();
void set(char *s);
private:
char *str;
};

Cstream::Cstream(char * s)
{
cout << "constructor" << endl;
str = new char[strlen(s) + 1];
if (!str)
{
cerr << "Allocation Error" << endl;
exit(1);//error 退出程序
}
strcpy(str, s);
}

Cstream::Cstream(const Cstream & temp)
{
cout << "copy constructor" << endl;
str = new char[strlen(temp.str) + 1];
if (!str)
{
cerr << "error in apply new space" << endl;
exit(1);
}
strcpy(str,temp.str);
}

Cstream::~Cstream()
{
cout << "destructor" << endl;
if (str != NULL)
delete[] str;//释放str指向的储存空间
}

void Cstream::show()
{
cout << str << endl;
}

void Cstream::set(char * s)
{
delete[] str;
str = new char[strlen(s) + 1];
if (!str)
{
cerr << "Allocation Error" << endl;
exit(1);
}
strcpy(str, s);
}
Cstream input(Cstream temp)//对象作为参数和返回值的普通函数
{
char s[20];
cout << "please input the string:";
cin >> s;//输入新字符串
temp.set(s);//赋值新字符串
return temp;//返回对象
}
int main()
{
Cstream A("Hello");
A.show();
Cstream B = input(A);//用input的函数值初始化对象B
A.show();
B.show();
return 0;
}

时间: 2024-12-15 09:20:14

对象做函数参数和函数返回值时,调用复制构造函数,构造函数,析构函数的情况的相关文章

C语言入门(十三)函数参数的传递和值返回

 函数参数的传递和值返回  前言: 前面我们说的都是无参数无返回值的函数,实际程序中,我们经常使用到带参数有返回值的函数. 一.函数参数传递 1.形式参数和实际参数 函数的调用值把一些表达式作为参数传递给函数.函数定义中的参数是形式参数,函数的调用者提供给函数的参数叫实际参数.在函数调用之前,实际参数的值将被拷贝到这些形式参数中. 2.参数传递 先看一个例子: void a(int); /*注意函数声明的形式*/ main() { int num; scanf(%d,&num); a(num);

智能指针(shared_ptr,unique_ptr)作为函数参数或者返回值时的一些注意事项

当智能指针作为函数的参数或者返回值时,一直在纠结到底是用智能指针对象本身还是用原始指针.Herb Sutter大师的文章很好的解决了这个疑惑,参见网址: https://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters/ 总结起来如下 1. 不要传递shared_ptr本身,而是用原始指针.因为会有性能损失,原子操作的自增自减等. 使用f(widget *w) 不使用f(shared_ptr< widget >

Golang中interface{}作为函数参数和函数返回值的使用

package main import (     "errors"     "fmt" ) type item struct {     Name string } func (i item) String() string {     return fmt.Sprintf("item name: %v", i.Name) } type person struct {     Name string     Sex  string } func

初识python 函数(定义,传参,返回值)

python基础(二): 菜鸟教程基础知识讲解的非常全面,内容选择我认为的重点输出一遍 函数: 定义一个函数: 你可以定义一个由自己想要功能的函数,以下是简单的规则: def fun(arg): pass return arg # 函数调用语法 fun(arg) arg:argument,参数(也叫prarmeter) ,任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数. def:define,定义,创建函数 ,函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()

3203 数组做函数参数----排序函数--C语言版

3203: 数组做函数参数----排序函数--C语言版 时间限制: 1 Sec  内存限制: 128 MB提交: 253  解决: 151[提交][状态][讨论版][命题人:smallgyy] 题目描述 定义一个函数来完成对参数数组中元素的排序工作,函数声明如下: void sort(int array[ ]);//该函数完成对array数组的排序工作 在以下程序的基础上,完成对sort函数的定义,提交时,只提交sort函数的定义即可. #include <stdio.h> void sort

3204: 数组做函数参数--排序函数2--C语言

3204: 数组做函数参数--排序函数2--C语言 时间限制: 1 Sec  内存限制: 128 MB提交: 211  解决: 143[提交][状态][讨论版][命题人:smallgyy] 题目描述 定义一个函数来完成对参数数组中元素的排序工作,函数声明如下: void sort(int array[ ],int n);//该函数完成对array数组的前n个元素的排序工作 在以下程序的基础上,完成对sort函数的定义,提交时,只提交sort函数的定义即可. #include <stdio.h >

函数参数、函数嵌套、作用域、名称空间

一.函数参数 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解. Python的函数定义非常简单,但灵活度却非常大.除了正常定义的必选参数外,还可以使用默认参数.可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码. 1.位置参数 我们先写一个计算x2的函数: def power(x): return x *

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

引用地址  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

工作随笔——Java调用Groovy类的方法、传递参数和获取返回值

接触Groovy也快一年了,一直在尝试怎么将Groovy引用到日常工作中来.最近在做一个功能的时候,花了点时间重新看了下Java怎么调用Groovy的方法.传递参数和获取返回值. 示例Groovy代码如下: # TestGroovy.groovy 定义testC方法,传入3个参数,返回处理后的数据 def testC(int numA, int numB, int numC) { "传入参数:" + numA + numB + numC + "计算之和为:" + (