构造函数浅析

张量/数组存储方式与向量化展开/展平、view、reshape、permute对比 对于一个Tensor来说,我们可以认为它有两种存储方式。 阅读详情

构造函数浅析

作者:normalnotebook


    构造函数把一堆无逻辑联系的存储单元单位转换成一个活生生的对象
.它可能用于初始化该对象的内部数据成员,也可能用于分配资源(内存、文件、信号量等等).构造函数是与类同名的成员函数.构造函数是在创建类的对象时自动调用的.其一般表现形式为:X::X();

class X

{

public:

       X();

       X(int );

protected:

    int value;

}

 

以下规则基于以上的例子讲解;

 

规则一:声明规则Ⅰ:

1.       即没有声明默认(缺省)构造函数,也没有声明其他构造函数,合法.

2.       如果只声明了默认(缺省)构造函数,合法.

3.       如果声明了默认(缺省)构造函数,但不是公有,错误.

4.       即声明了默认(缺省)构造函数, 也同时声明了带默认参数的构造函数.错误.因为存在暧昧构造函数调用.

不带任何参数的构造函数称为默认(缺省)构造函数.如果违背了规则中的第三条,将会引起编译错误.必须声明为public型.(思考:为什么?). 如果声明了带默认参数的构造函数.即声明X(int=0 );函数.那么就可以这样调用X a;如果同时也声明了X();将会引起编译错误.因为编译器无法知道链接到哪个函数,是X();还是X(int=0 );函数呢?所以不可能出现以下这种情况.

class X

{

public:

       X();

       X(int=0 );//错误.这两个只能出现一个.即有我不能有你.

protected:

    int value;

}

同时也要注意下列两种情况:

A.     如果没有声明默认构造函数,但声明了一个或者多个要求实参的构造函数.

那么以X a;创建对象a时,将引起编译错误.因为实参太少.只能以这种情况创建X a(参数列表);

B.      如果没有定义默认构造函数,但是定义了一个或者多个要求实参的构造函数,且带默认参数.

则可以解决A中的错误.

 

规则二:声明规则Ⅱ:

1.  构造函数不能指定返回值类型和返回值.

2.  不能被声明为虚函数

3.  可以重载构造函数.

与之对应的析构函数可以被声明为虚函数,但不能重载析构函数.一个类只能有一个析构函数,且不能向构造函数那样给析够函数传递参数

 

规则三:初始化规则:

1.       类的数据成员不能在定义类的时候初始化.

2.       必须在类的构造函数中初始化、或者在建立类的对象后在设置它们的值.

C++程序与Java程序不同,java程序可以在声明类时,给数据成员赋初值,但在C++中是不允许的.而必须在类的构造函数中初始化.即按成员初始化表来初始化数据成员.如X::X():value(3){};对于任何类型的const和引用数据成员,必须在成员初始化表中被初始化,否则,就会引起编译时刻错误.而对于其他内部类型可以在构造函数中赋初值.

 

规则四:调用顺序规则:

1.       在创建一个对象时自动地调用一个构造函数.

2.       在创建一个派生类对象时,首先执行基类的构造函数,然后执行派生类成员对象的构造函数,最后才执行派生类的构造函数.(析构函数的调用规则与构造函数相反).

3.       如果没有显示定义构造函数,那么编译器就会为该类添加一个默认构造函数,但该默认构造函数并不做任何初始化工作.

 

 

规则五:定义对象规则:

只有当没有声明构造函数或者声明了缺省构造函数时,或者声明了带默认参数的构造函数时,我们才能不指定实参来定义类对象.

X a();  //  编译错误   被编译器解释为定义了一个没有参数,返回一个X类型对象的函数.用缺省构造函数初始化类对象的正确声明是去掉括号.而不是调用缺省构造函数.

 

规则六:拷贝构造函数:

1.       当通过数值传递,通过数值返回,或者明确地拷贝一个对象时就应该调用拷贝构造函数.

2.       拷贝构造函数特征标记为:X::X(const X&).

3.       拷贝构造函数的参数虽然不一定是const,但它必须是引用.(思考,为什么?)

 

如果有什么不对的地方,还请大家多提批评意见.normalnotebook@126.com

 

 

 

Android开发工程师面试问题与参考答案 这是一份Android开发工程师职位面试指南,主要针对自研OS开发岗位。岗位要求3年以上独立开发经验,熟悉Android平台UI设计、四大组件和Java基础。面试问题覆盖五大核心领域:基础知识、开发经验、技术深度、问题解决和性能优化。文章提供了典型面试问题及专业参考答案,帮助应聘者准备关键技术点,如多线程处理、HashMap与ConcurrentHashMap区别、Handler机制等。同时建议应聘者结合项目经验展示优化能力,并注意公司提供完善的薪酬福利和团队文化。 阅读详情

相关推荐

当windows安装git时出现以下错误提示

Windows安装Git时出现多个系统配置设置失败错误(exit code 4294967295),提示包括无法设置textconv、LFS过滤器和SSL等配置项。关键问题在于scalar.exe版本不兼容,系统提示"该版本的scalar.exe与你运行的Windows版本不兼容"。解决方案是检查程序版本是否正确,下载与Windows系统兼容的正确版本重新安装即可。

沧澜的博客 1876

C++中构造函数初始化列表为什么会比构造函数中赋值要高效

Test { Test(test& t1) { this->t=t1; } private: test t; } 相信很多人跟我一样,非常困惑为什么Test构造时会先调用test的构造函数,再调用test类的赋值操作符。那是因为赋值操作符不能产生新的对象,Test构造时免不了要构造一个test对象。所以正常流程是 先构造t,然后再调用赋值操作符赋值t(this->t=t1)。

bama2488313716的专栏 2026

ArcGIS 10.8软件安装包免费下载及安装教程

ArcGIS 10.8安装教程

qq_44894692的博客 2万+

为什么 没有缺省构造函数的类类型成员 必需要在初始化列表 里初始化 ?

名词解释1、缺省构造函数:类的构造函数无参或参数默认值统称为缺省构造函数。2、初始化列表:与其它函数不同,构造函数除了有名字,参数列表和函数体外还可以有初始化列表。列表以冒号开始后跟以逗号隔开的初始化字段。类成员是在构造函数的初始化列表创建好的,在创建类成员的同时,给成员变量一个初始化值。在解释原因之前,需要了解构造函数是如何执行的构造函数的执行过程首...

weixin_34138377的博客 582

手把手教你用运放搭建方波三角波发生器(附Multisim仿真文件)

本文详细解析了使用运算放大器搭建方波和三角波发生器的核心原理与设计步骤。通过剖析迟滞比较器与积分器的联动机制,指导读者进行电路设计、元件选型,并借助Multisim仿真进行参数调优与波形优化。文章提供了从理论分析、虚拟仿真到实物焊接调试的完整实践指南,并附有仿真文件,帮助硬件爱好者与初学者深入掌握这一经典模拟电路设计。

weixin_29165725的博客 642

别再为SCI论文配图发愁了!手把手教你用PS+AI搞定从数据图到模式图的全流程

本文详细解析了如何利用Photoshop(PS)和Illustrator(AI)高效完成SCI论文配图的全流程,涵盖数据可视化、模式图设计及期刊适配性输出。通过实战案例,帮助科研人员掌握位图与矢量图的处理技巧,提升论文配图质量,满足不同期刊的出版要求。

weixin_28630185的博客 382

C++ 构造函数浅析

1、C++ 构造函数分类

markman101---神即是道 道法自然 如来 855

基于STM32L4XX 、HAL库的TMP144YFFR数字温度传感器驱动应用C语言程序设计

define TMP144_ADDRESS 0x00 // 默认为全局地址,用于单器件或MDA命令。#define TMP144_CMD_READ_TEMP 0x00 // 读取温度寄存器命令。if (temp_raw & 0x800) { // 判断第11位(符号位)

PP_Cottage的博客 91

浅析复制构造函数

类的成员函数中有一类很值得注意,它们会在程序员未声明定义时自动生成,这类函数叫做特殊成员函数。忽略它们时编译器一般不会报错,但可能会导致意想不到的严重问题。 特殊成员函数包括构造函数,折构函数,赋值运算符等。这里我们主要探讨一下构造函数中的复制构造函数(Copy Constructor )。 在初始化类对象时,我们一般使用默认构造函数或程序员自己定义的非默认构造函数。进一步来说,当我们使用类对象...

weixin_45477786的博客 359

46.qt quick-自定义非常好看的qml虚拟软键盘-支持换肤、动态加载移除语言(二)

在上章我们学习了45.qt quick-qml虚拟软键盘详解(一)_诺谦的博客-优快云博客 接下来我们便来自定义一款好看的qml软键盘.如下图所示: 支持背景更换、支持动图: 支持动态加载移除语言: 支持拖拽、自由缩小放大: 支持定位坐标: ...

抵抗时间扭曲,坚持做一件有意义的事 4674

R语言生存分析之竞争风险模型

R语言生存分析之竞争风险模型 竞争风险模型(Competing Risk Model)是一种处理多种潜在结局生存数据的分析方法,早在1999年Fine和Gray就提出了部分分布的半参数比例风险模型,通常使用的终点指标是累积发生率函数(cumulative incidence function,CIF)。 研究中结局事件可能有多个,某些结局将阻止感兴趣事件的出现或影响其发生的概率,各结局事件形成“竞争”关系,互为竞争风险事件。 竞争风险模型( Competing Risk Model ) : 指

data+scenario+science+insight 5248

浅析构造函数

构造函数

zzl122377的博客 343

二十一、SAP-库存管理

业务逻辑、功能讲解、图文解析、章节总结

m0_72403327的博客 1811

继承构造函数浅析

1. 使用方式 c++11的继承构造函数可以让派生类直接使用基类的构造函数,而无需自己再写构造函数,尤其是在基类有很多构造函数的情况下,可以极大的简化派生类构造函数的编写。 2. 实例 #include <iostream> using namespace std; class Parent { public: Parent(int i) : m(i) { cout << m << endl; } Parent(int i, int j) : m(

www_dong的博客 183

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++构造函数行为浅析

深度探索C++对象模型——第二章 构造函数语义学 文章目录深度探索C++对象模型——第二章 构造函数语义学需要注意2.1 Default Constructor 的构造操作①"带有Default Constructor"的Member Class Object②“带有Default Constructor”的Base Class③“带有一个Virtual Function”的Class④ “带有一个Virtual Base Class”的Class小结:2.2 Copy Constructor 的构造操作D

Noob_Zhou的博客 765

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

浅析构造函数和析构函数

 本文通过一个简单的程序来分析一下构造和析构函数#include "stdio.h"#include string>#include iostream>using namespace std;class Test...{    public:        Test();//line 9        Test(int newValue, const string& newString);

mylife4u的专栏 459

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

构造函数链和委托构造函数浅析

本文对于构造函数链和委托构造函数的用法机制进行了浅要分析

qq_73884528的博客 313

C++的构造函数浅析

C++的构造函数浅析 1、   C++的构造函数分为 系统默认构造函数 和 自定义构造函数 ,并且构造函数的访问权限必须是public,且为无参的函数,同时没有返回值的概念,也就是不需要返回值。   2、   C++中的构造函数只用于类对象的声明,在定义对象的时候要确定调用了什么样的构造函数可分为以下情况: 1)、当没有自定义构造函数的时候,ClassNameobject; 和ClassN

lilei2013的专栏 381

构造函数与析构函数浅析

根据调查,有不少的程序错误是由于没有正确的初始化和清除造成的,这是因为程序员们容易遗忘掉初始化和清除的工作。而C++充分地考虑到了这个问题并给予了解决,引入了构造函数和析构函数。

qq_56870066的博客 964

浅析拷贝构造函数

这篇文章,主要是受Jinhao (辣子鸡丁·GAME就这样OVER了 )在优快云上一篇题为《有关拷贝构造函数的说法不正确的是》的帖子启发,鸡丁就这四个问题回答如下。   拷贝构造函数的名字和类名是一样的 [错]    类中只有一个拷贝构造函数 [错]   拷贝构造函数可以有多个参数 [对]         拷贝构造函数无任何函数类型 [错]在这里我不想讨论以上问题的正确与错

ugg的专栏 3055

浅析构造函数之默认构造函数

C++的默认构造函数可谓“博大精深”,一度把博主我搞的晕头转向的,各种跪,后来久经曲折,终于得了那么一点门道。。。 谨记一句话,构造函数的工作是保证每个对象的数据成员具有合适的初始值!额,也许你会说这个连幼稚园小朋友都知道的不是么,不过,或许我们真的不如幼稚园小朋友呢。。 构造函数里感觉最让人头疼的是默认构造函数(default constructor),default constructor

moubao的专栏 618

C++ 拷贝构造函数浅析

什么是拷贝构造函数: 拷贝构造函数,顾名思义,就是在拷贝的时候调用的构造函数。 几个原则: C++ primer p406 :拷贝构造函数是一种特殊的构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用。当定义一个新对象并用一个同类型的对象对它进行初始化时,将显示使用拷贝构造函数。当该类型的对象传递给函数或从函数返回该类型的对象时,将隐式调用拷贝构造函数。 C++支持两种...

PengQ1的博客 296
上一篇: JNI使用技巧点滴(二)
下一篇: 在Debian中打造属于自己的deb包
normalnotebook
博客等级 码龄24年 647粉丝 38原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值