-
2019-07-29 14:09:13
我一直很疑惑,实参初始化形参时,是通过拷贝构造函数还是赋值运算符。
今天来做一个测试。首先创建一个类,实现其构造函数、拷贝构造函数、赋值运算符函数。
class A { public: A() { cout << "构造函数" << endl; } A(const A &a) { cout << "拷贝构造函数" << endl; } A& operator=(const A& a) { cout << "赋值运算符" << endl; return *this; } };
一、值传递
定义一个值传递的函数。
void fun(A a) {}
调用
A a; cout << "call fun" << endl; fun(a);
结果:
构造函数
call fun
拷贝构造函数结果出来了,是通过拷贝构造函数。
二、引用传递
定义一个引用传递的函数。
void fun(const A &a) {}
调用
A a; cout << "call fun" << endl; fun(a);
结果:
构造函数
call fun更多相关内容 -
C++ 形参初始化及析构顺序
2019-05-09 17:41:37形参初始化顺序从右向左,析构与构造顺序相反 由于是栈空间所以,先构造后析构,后构造先析构。 测试代码: #include <iostream> using namespace std; class Test { public: Test(int); Test(Test&); ...形参初始化顺序从右向左,析构与构造顺序相反
由于是栈空间所以,先构造后析构,后构造先析构。
测试代码:
#include <iostream> using namespace std; class Test { public: Test(int); Test(Test&); ~Test(); private: int a; }; Test::Test(int i) { a = i; cout << "constructing " << a << endl; } Test::Test(Test& test) { a = test.a; cout << "copying " << a << endl; } Test::~Test() { cout << "destructing " << a << endl; } void outPut(Test test1, Test test2); int main() { Test* a = new Test(3); Test test1(1); Test test2(2); outPut(test1, test2); system("pause"); return 0; } void outPut(Test test1, Test test2) { }
测试结果:
-
C语言结构体变量的定义,初始化,作为函数形参调用
2021-07-28 14:18:14以下给出了一个例子,实现了结构体变量的定义,初始化,作为函数形参调用。 代码: #include <stdio.h> struct Day // 定义一个结构体Day { char Data[100]; char Weather[100]; char Mood[100]; }; void ...以下给出了一个例子,实现了结构体变量的定义,初始化,作为函数形参调用。
代码:#include <stdio.h> struct Day // 定义一个结构体Day { char Data[100]; char Weather[100]; char Mood[100]; }; void printDay(struct Day SpecialDay) // 在函数中将结构体变量作为参数 { printf("今天的日期是 %s\n", SpecialDay.Data); printf("今天的天气是 %s\n", SpecialDay.Weather); printf("今天的心情是 %s\n", SpecialDay.Mood); } int main() { struct Day SpecialDay = { "2021年7月28日", "中雨", "平静" }; //结构体变量的定义及初始化 printDay(SpecialDay); }
输出为:
今天的日期是 2021年7月28日 今天的天气是 中雨 今天的心情是 平静
-
C++中map和vector作形参时如何给定默认参数?
2020-08-26 03:53:46今天小编就为大家分享一篇关于C++中map和vector作形参时如何给定默认参数?,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 -
资源管理类,形参初始化顺序,传引用和传递值的区别?对象切割问题?当派生类传递给以下函数时发生什么?为...
2020-08-05 17:35:51文章目录资源管理类形参初始化顺序传引用和传递值的区别?对象切割问题?当派生类传递给以下函数时发生什么?不要返回为什么运算符重载,返回value,形参是引用?22 成员尽量用private23封装的程度怎么衡量?怎么...文章目录
资源管理类
形参初始化顺序
传引用和传递值的区别?
效率方面:
1.传值:对于类,会调用拷贝构造函数。
2.传引用:不会调用构造函数。
对于内置类型、stl迭代器、函数对象传值效率更好。对象切割问题?当派生类传递给以下函数时发生什么?
fun(const 基类&w){}//w是派生类
fun(基类w){}//w是基类,派生类被切割了21
local变量 stack空间 函数退出前销毁
new创建 heap空间不要返回
1.指针/引用->local stack对象、local static 对象(唯一)
2.引用->heap分配的对象为什么运算符重载,返回value,形参是引用?
以*为例子 1) 重载运算符要写operate*(参数1,参数2) 2) 积 放在哪里呢? 如果放在堆里 operate*(const A& a,const A& b){ new c; return *c; }//可能资源泄露,用户忘记delete 如果放在栈里,函数结束后就被销毁。 3)所以返回value,一个副本 形参是引用是为了效率。
22 成员尽量用private
原因:
- 类代码修改,使用public成员的客户可能受影响
- 类代码修改,使用protected的派生类可能受影响
23封装的程度怎么衡量?怎么方便地扩展工具包?
衡量标准:访问成员数据的函数数量,数量反比与封装程度。
解决方法:用非成员函数、非友元函数。
前提知识:命名空间namespace可以跨过不同文件。
24如果函数的形参都需要类型转换,则定义为non-member
案例:
为什么需要类型转换?
当定义数值类时,比较自然,比如有理数类。
为什么定义为non-member函数?
比如定义乘法operate *是成员函数 2*object;//无法通过编译 因为2是*this,只有形参会自动转换,this不会。 解决方法: 都放到形参里面
-
C++初始化函数形参
2014-10-10 23:53:52int add(int a,int b) { return a+b; } add(1,2); int add(int a,int b=1,int c=0,char*s=NULL) { printf("a=%d,b=%d,c=%d\n",a,b,c); a=a+b; return a; } int _tmain(int argc, _TCHAR* argv[]) ... // add -
拷贝构造函数中的形参引用,初始化与赋值的区别
2019-11-16 12:00:53使用对象t给copy_t进行初始化,此时初始化过程会第二次调用拷贝构造函数,第二次调用中的形参再一次需要初始化,无限循环,导致内存溢出。 2、初始化与赋值 区别在于需要被赋值或者初始化的对象是否存在,如果... -
关于C语言初始化,以及形参实参的一道易错题
2016-03-04 11:35:19关于C语言初始化,以及形参实参的一道易错题 -
Java – 使用类型参数发出初始化类
2021-03-06 02:22:55我在使用类型参数初始化类时遇到问题.这似乎是Java类型推断的一个缺点,我想知道是否有办法绕过这个或更好的方法实现这一点.public class ParentModel {}public class ChildModel extends ParentModel {}public class... -
java中的初始化是什么意思
2021-02-26 17:24:39java中的初始化是什么意思发布时间:2020-06-26 15:36:20来源:亿速云阅读:245作者:Leahjava中的初始化是什么意思?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴... -
C++之用参数初始化表对数据成员初始化
2018-05-12 16:23:27#include <iostream>using namespace std;struct Box{ public: Box(int len,int w,int h):length(len),width(w),height(h){} int volume(); private: int length; int width;... -
如何初始化对象——浅谈构造函数
2020-03-17 00:17:53在一开始学习C语言时,老师就叮嘱过使用变量时,一定要记得初始化,不然会出现奇奇怪怪的值,比如字符串没有初始化,会输出内存中本来的字符,直到遇到 ‘\0’。 同样的类也是一种数据类型,所以我们也需要对对象... -
MFC中通过文件对结构体初始化
2008-11-26 09:36:58通过文件对结构体初始化的一个简单的示例。该初始化是通过MFC做的。只是用到里面的函数 -
【C++】引用、引用初始化、引用折叠规则
2019-12-12 21:00:51本文讲述:• 引用 • 引用的初始化 • 引用折叠规则 • 当提到引用时实际表示什么 • 函数的引用是形参 • 函数返回引用 -
python014(初始化方法04—使用参数设置初始值)
2019-03-30 22:26:53在开发中,如果希望在创建对象的同时,就设置对象的属性,可以对__init__方法进行改造 ... 在方法内部使用self,属性=形参接受外部传递的参数 在创建对象时,使用类名(属性1,属性2...)调用 ... -
C++指针声明、初始化、基本操作和参数传递
2018-11-21 16:22:48这一系列文章用于记录技术小白在学习道路上遇到的那些坑,在刚开始接触C系列的...1、声明和初始化指针 指针是一种变量,其值是一个内存地址。 形式如下: Type * pointerVariable; Type * pointerVariable = ad... -
函数指针的几种初始化方法
2018-07-01 09:00:40初始化函数指针时,为何既可以在函数名之前加&操作符,又可以不加? 问题2: 函数调用方式有几种,他们之间的区别是什么 ? 问题3: 函数指针的用途有哪些? 1: 函数指针初始化方式有两种: 方式2中的 &操作符是 可... -
C++中的初始化参数列表
2018-03-09 14:20:00c++中以下几种情况的变量的初始化不可以写在构造函数里,而是要写在初始化参数列表中 1.const常量 class AA { public : const int num; public : AA():num(123)//在初始化列表里初始化const常量 { ... -
c语言中将函数中数据通过形参返回给未初始化的变量时,形参需是指针或者引用
2020-08-27 13:49:13我们在这篇文章中已经分析函数三种传参的形式,本文中,再通过实例分析函数通过形参返回数值的情况: void* func() { int* num = new int; //空间在main函数中释放,num指针为函数内的局部变量 *num = 100; ... -
类参数初始化列表
2016-12-29 20:19:22#include using namespace std ; class B1 { public: B1(int ii=0); void print(){cout;} ~B1(); private: int i; }; B1::B1(int ii):i(ii){}; B1::~B1() { } int main(){ B1 a(1),b(2 -
vector的初始化及常用操作
2018-08-02 11:20:421.vector的初始化:可以有五种方式,举例说明如下: (1) vector<int> a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。... -
关于数组作为形参以及二维整型数组的初始化
2012-09-29 19:44:12好久不写代码,今天动动手就出现了bug:关于数组作为形参的bug,以及二维整型数组初始化的bug。先看看代码吧: void test(int p[]) { int n = sizeof(p) / sizeof(p[0]); int m[n][n]; memset(m, 1, sizeof(p[0... -
二级指针作为函数参数传递初始化的一点总结
2017-08-28 20:13:02...main函数中InitStack(&s),之所以去s的地址是因为如果直接用s...在这里用二级指针就相当于把指针的地址传递给了形参,然后在函数中,在s的地址进行操作,在InitStack改变s值,同时在在main函数中会同步 -
c++形参直接初始化,实参可以为空,这是啥操作
2021-11-24 14:20:49我记得上面这2种情况 c都无法编译,这里我编译过了,如果实参有数据,形参就等于实参,如果实参没有就用形参初始化得值,我得理解是,a.addNum()编译得时候符号表应该是没有参数得,他怎么知道指向函数的,这2个符号... -
C语言二维数组初始化和作形参时常见的坑
2020-11-16 17:22:36C语言中二维数组初始化和作为形参的设定细节 -
未处理的“System.NullReferenceException”类型的异常。指针作为形参初始化问题
2012-11-16 17:39:06问题是我在函数外定义了指针,却没有初始化,初始化放在函数体内了,指针作为形参,必须要在具体的地方初始化。 double **kdistance = new double*[count]; double *undistance = new double[count]; if -
JAVA泛型(一)泛型基础
2021-03-06 15:52:31泛型入门使用泛型Java5之后,Java引入了“参数化类型”的概念,允许程序在创建集合时指定元素的类型。importjava.util.ArrayList;importjava.util.List;public classa{public static voidmain(String[] args){List ... -
C#参数详解一(形参和实参)
2020-09-28 12:47:55参数详解参数形参实参值参数 我们知道方法是可以被程序中很多地方调用的命名代码单元,它能把一个值返回给调用代码。返回一个值的确有用,但如果需要返回多个值呢?还有,能在方法开始执行的时候把数据传入方法也会... -
c语言结构体学习整理(结构体初始化,结构体指针)
2018-11-01 20:22:12请注意,在我们进行数组初始化的时候如果定义的数组过长,而我们只初始化了一部分数据,对于未初始化的数据如果是数值型,则会自动赋值为0,对于字符型,会自动赋初值为NULL,即‘\0’ 即不足的元素补以默认值 这里... -
初始化列表的作用
2014-08-23 18:34:58冒号这种初始化方法,也叫做,初始化列表,也就是变量初始化的时候调用的 意味着,在一个类当中,一个成员变量只能在初始化赋值。 比如: const, 比如引用&。 举个例子: class A { public: A()
收藏数
138,460
精华内容
55,384