精华内容
下载资源
问答
  • 由上可见,不加括号的话,相当于直接将类名称赋予了变量。加括号的话是创建了一个新类,是正常调用

    在这里插入图片描述
    由上可见,不加括号的话,相当于直接将类名称赋予了变量。加括号的话是创建了一个新类,是正常调用。

    展开全文
  • 必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性. 如何保证对象唯一性呢? 1.不允许其他程序用new创建对象. 2.在该类创建一个本实例. 3.对外提供一个方法让其他程序可以获取该对象. ...
  • 该系列为C++初学者设计编写不易,希望获得收藏,关注和转发的支持,谢谢。构造函数基本概念对类的对象进行初始化,因为这类是...例如:希望在构造一个Clock类对象时初试时间设为0:0:0,就可以通过构造函数来设置...

    该系列为C++初学者设计

    编写不易,希望获得收藏,关注和转发的支持,谢谢。

    构造函数基本概念

    对类的对象进行初始化,因为这类是新定义的类,所以系统没有相关对象的定义范围,你只能通过自己来定义。

    构造函数

    类中的特殊函数

    用于描述初始化算法

    构造函数的作用

    在对象被创建时使用特定的值构造对象,

    将对象初始化为一个特定的初始状态。

    例如:

    希望在构造一个Clock类对象时,

    将初试时间设为0:0:0,

    就可以通过构造函数来设置。

    构造函数的形式

    函数名与类名相同

    不能定义返回值类型,也不能有return语句

    可以有形式参数,也可以没有形式参数

    可以是内联函数

    可以重载

    可以带默认参数值

    构造函数的调用时机

    在对象创建时被自动调用

    例如

    Clock myclock(0,0,0)

    默认构造函数

    调用时可以不需要实参的构造函数

    ·参数表为空的构造函数

    全部参数都有默认值的构造函数

    下面两个都是默认构造函数

    如在类中同时出现,将产生编译错误

    Clock();

    Clock(int newH=0,int newM=0,int newS=0);

    隐含生成的构造函数

    如果程序中未定义构造函数,编译器将自动生成

    一个默认构造函数

    参数列表为空,不为数据成员设置初始值;

    如果类内定义了成员的初始值,则使用内类定义的初始值;

    如果没有定义类内的初始值,则以默认方式初始化;

    基本类型的数据默认初始化的值是不确定的。

    =default"

    如果程序中已定义构造函数,默认情况下编译器就不再隐含生成

    默认构造函数。如果此时依然希望编译器隐含生成默认构造函数,

    可以使用“=default”

    例:

    class Clock {

    public:

    Clock0 =default;//指示编译器提供默认构造函数

    Clock(int newH, int newM, int newS); //构造函数

    private:

    int hour,minute,second;

    }

    构造函数 ——例题1

    1049a90580c500229e27e9a0184264c5.png
    999060c974cdbd545f6a6e37c61b6354.png

    图2的构造函数定义它的初始化办法是用初始化列表的形式来做的。

    这是一种首选的初始化方法,这样的话就可以简写在函数体中。来进行定义初始化。

    c5cb36772d64593b92b991f5ed4a1422.png
    1dc4fe840e8b1791c039bee73dffb9e3.png

    一般会多编写一个隐含构造函数,以备在没有参数或者是其他一些情况中使用。

    整体代码

    include

    using namespace std;

    class Clock {//时钟类的定义

    public: //外部接口,公有成员函数

    Clock(int newH, int newM, int newS);//构造函数

    Clock();//默认构造函数

    void setTime(int newH = 0, int newM = 0, int newS = 0);

    void showTime();

    private: //私有数据成员

    int hour, minute, second;

    };

    //时钟类成员函数的具体实现

    Clock::Clock(): hour(0), minute(0), second (0) {}//默认构造函数

    Clock::Clock(int newH, int newM, int news): hour(newH), minute(newM),second(new S)

    void Clock::setTime(int newH, int newM, int newS)

    hour = newH;

    minute = newM;

    second = news;

    inline void Clock::showTime() {

    cout<< hour <

    //主函数

    int main() {

    Clock c(8, 10,0);//自动调用构造函数

    Clock c2; //调用无参数的构造函数

    c. showTime ();

    c2.showTime ();

    return 0;

    委托构造函数

    我们在一个类中重载多个构造函数时发现只有它们的形参表和初始化列表不同外初始化算法相同,函数体都是相同的。为了避免这种重复工作,我们使用到了委托构造函数。

    回顾:

    Clock类的两个构造函数:

    Clock(int newH, int newM, int newS):

    hour(newH), minute(newM), second(newS) //构造函数

    Clock:Clock):hour(0),minute(0),second(0)//默认构造函数

    利用委托构造函数,我们可以将其改进为。

    委托构造函数

    委托构造函数使用类的其他构造函数执行初始化过程

    hour(newH),minute(newM),second(newS){}

    Clock():Clock(0,0,0)() //很明显,在这一步,我们用无参数的构造函数调用了有参数的构造函数,而且这样的好处在于,如果将构造函数进行修改时,可以使其他构造函数协同改变。

    复制构造函数

    本质是用已存在对象去初始化新对象。

    可以用已有对象的引用去做构造函数的参数。

    编译器会在没有定义复制构造函数时定义一个隐含的复制构造函数,会实现两个成员之间对象的一一对应复制。

    复制构造函数定义

    复制构造函数是一种特殊的构造函数,其形参为本类的对象引用.

    作用是用一个已存在的对象去初始化同类型的新对象。

    class 类名(

    类名(形参);//构造函数

    类名(const类名对象名);//复制构造函数

    //...

    类名:类( const 类名&对象名)//复制构造函数的实现

    { 函数体 }

    复制构造函数被调用的三种情况

    定义一个对象时,以本类另一个对象作为初始值,发生复制构造,

    1、如果函数的形参是类的对象,调用函数时,将使用实参对象初始

    化形参对象,发生复制构造;

    2、如果函数的返回值是类的对象,函数执行完成返回主调函数时,

    3、将使用return语句中的对象初始化一个临时无名对象,传递给主

    调函数,此时发生复制构造。

    这种情况也可以通过移动构造避免不必要的复制

    隐含的复制构造函数

    如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成

    一个隐含的复制构造函数。

    这个构造函数执行的功能是:用初始值对象的每个数据成员,初始

    化将要建立的对象的对应数据成员。

    注意,一般来说,默认的复制构造函数在遇见类的成员中有指针情况的时候,隐含的复制构造函数只能达到浅层目标,达不到深层复制的要求。这时就需要自己编写复制构造函数。

    简单的来说,隐含的复制构造函数就是原样照搬。

    而自己定义的复制构造函数则是以自己需求的方式来对对象进行构造。

    “=delete”

    如果不希望对象被复制构造

    C++98做法:将复制构造函数声明为private,并且不提供函数的实现。

    C++11做法:用“=delete”指示编译器不生成默认复制构造函数。

    ·例:

    class Point (//Point 类的定义

    Point(int xx=0, int yy=0)(x=x; y =yy; //构造函数,内联

    Point(const Point& p) =delete; //指示编译器不生成默认复制构造函数

    int x,y; //私有数据

    复制构造函数调用举例

    int getY() const{

    return y;

    private: //私有数据

    int x, y;

    成员函数的实现

    Point::Point(const Point & p){

    X=p.x;

    y = p.y;

    cout << “Calling the coDY constructor" << endl;

    //形参为Point类对象的函数

    void funl(Point n){

    cout <

    //p. setX(1);

    //返回值 为Point类对象的函数。

    fun2(){

    Point a;

    return a;

    //主程序

    int main ()

    Point a; //第一个对象A

    Point b(a); //情况一,用A初始化B。第一次调用拷贝构造函数

    cout << b.getX()<< endl;

    fun1(b) //情况二,对象B作为fun1的实参。第二次调用拷贝构造函数,经调试发现,首先先进入复制构造函数,对形参对象进行初始化,之后再进入fun1函数。

    b = fun2(); //情况三,函数的返回值是类对象,函数返回时,调用复制构造函数。

    cout < b.getX()<< endl;

    讲解:

    之所以复制构造函数在情况三的应,Point a,不调用复制构造函数是因为这是个部分a只是个局部变量,当期和主函数产生联系也就是返回问一个point a这个值,这时才调用复制给我的函数。

    未完待续,谢谢收看 如果喜欢我的系列记得、点赞、收藏、加关注

    展开全文
  • 假设Employee是基类,Singer是派生,并添加一个char*成员,该成员指向有new分配的内存。...这释放由Singer对象中的Employee部分指向的内存,但不会释放成员指向的内存。 但如果析构函数是虚...

    假设Employee是基类,Singer是派生类,并添加一个char*成员,该成员指向有new分配的内存。

    下面的代码:

    Employee *pe = new Singer;
    delete pe;

    如果使用默认的静态编译,delete语句将调用~Employee()析构函数。这将释放由Singer对象中的Employee部分指向的内存,但不会释放新的类成员指向的内存。

    但如果析构函数是虚的,则上述代码将先调用~Singer析构函数释放由Singer组件指向的内存,然后调用~Employee()析构函数来释放由Employee组件指向的内存。

    这意味着,即使基类不需要显示析构函数提供服务,也不应依赖于默认构造函数,而应提供虚析构函数,即使它不执行任何操作:

    virtual ~BaseClass(){}

    顺便说一句,给类定义一个虚析构函数并非错误,即使这个类不作基类;这只是一个效率方面的问题。

     

    提示:通常应该给基类提供一个虚析构函数,即使它并不需要析构函数。可以为以后拓展类组合继承打下基础。

    展开全文
  • 问题是:在尝试构建UI之前,运行脚本不会出现任何语法错误。在我运行最后两行代码之前,一切似乎都很好。在我得到以下错误:错误:运行...我是来上课的,如果能解释一下为什么会出现这个错误,我不胜感激...

    问题是:

    在尝试构建UI之前,运行脚本时不会出现任何语法错误。在我运行最后两行代码之前,一切似乎都很好。在

    我得到以下错误:

    错误:运行时错误:文件第41行:对象名“mst_txtfld_x\u value”不唯一。

    我确保第8~9行中的deleteUI,所以我假设textField被创建了两次。在

    或者我对课程应该如何运作有什么不理解的地方?

    我是新来上课的,如果能解释一下为什么会出现这个错误,我将不胜感激。在

    代码:import maya.cmds as mc

    from functools import partial

    class MoveSelTool(object):

    def __init__(self, *args):

    pass

    if(mc.window("ak_move_sel_tool_window", query=True, exists=True)):

    mc.deleteUI("ak_move_sel_tool_window")

    def build_window_UI(self):

    self.window = mc.window("ak_move_sel_tool_window",

    title="Move Selection Tool")

    self.columnLayout = mc.columnLayout()

    self.txt_directions = mc.text(align="left",

    label="Directions: Input translation increment.\n")

    self.rowColumn = mc.rowColumnLayout(numberOfColumns=8)

    self.txt_x = mc.text(label=" X: ",

    align="right")

    self.txtfld_x = mc.textField("mst_txtfld_x_value",

    ann='input units to move X',

    width=50)

    self.txt_y = mc.text(label=" Y: ",

    align="right")

    self.txtfld_y = mc.textField("mst_txtfld_y_value",

    ann='input units to move Y',

    width=50)

    self.txt_z = mc.text(label=" Z: ",

    align="right")

    self.txtfld_z = mc.textField("mst_txtfld_z_value",

    ann='input units to move Z',

    width=50)

    self.txt_space = mc.text(label=" ")

    self.move_btn = mc.button(label="Move")

    #ui commands

    mc.button(self.move_btn,

    edit=True,

    command=partial(self.move_selection))

    mc.textField("mst_txtfld_x_value",

    enterCommand=partial(self.move_selection))

    mc.textField("mst_txtfld_y_value",

    enterCommand=partial(self.move_selection))

    mc.textField("mst_txtfld_z_value",

    enterCommand=partial(self.move_selection))

    #show ui

    mc.showWindow(self.window)

    def query_mst_user_input(self):

    self.x_value = mc.textField("mst_txtfld_x_value",

    query=True,

    text=True)

    self.y_value = mc.textField("mst_txtfld_y_value",

    query=True,

    text=True)

    self.z_value = mc.textField("mst_txtfld_z_value",

    query=True,

    text=True)

    return (self.x_value, self.y_value, self.z_value)

    def move_selection(self):

    self.mst_user_selection = mc.ls(selection=True)

    self.mst_user_inputs = query_mst_user_input()

    mc.move(self.mst_user_selection,

    self.mst_user_inputs[0],

    self.mst_user_inputs[1],

    self.mst_user_inputs[2],

    relative=True)

    def show(self):

    self.build_window_UI()

    mst=MoveSelTool()

    mst.show()

    展开全文
  • 优雅的创建对象

    2020-10-14 16:38:05
    问题 考虑使用静态工厂方法替代构造方法 代码示例:[外链图片转存失败,源站可能有防盗链机制,...它们不需要每次调用时创建一个新对象。 它们可以返回其返回类型的任何子类型的对象。 他们返回对象的可以根据输
  • 创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 class Date { public: Date(int year, int month, int day) { _year = year; _month = month; _day = day; } private: ...
  • java创建对象

    2017-09-26 17:11:34
    *面向对象:当创建一个新对象时JVM做了三件事情如下    如当创建p对象时:  Person p = new Person();  1.JVM在栈内存中创建了一个引用类型的变量p;  2.在堆内存中为对象开辟了内存空间,且调用了构造方法,...
  • 不需要关系数据库,可以用shelve模块作为持久存储Python对象的一个简单的选择。类似于字典,shelf按键访问。值被腌制并写至由dbm创建和管理的数据库。 7.2.1 创建一个shelf 使用shelve最简单的方法就是利用...
  • 说得再具体点,过去我们总是创建包含所需行为的对象,然后将对象传递给想要控制的方法,一般使用匿名内部来实现。假设现在有这么一个需求:有一个员工信息列表,根据年龄过滤出符合条件的员工信息// 过滤出大于35...
  • 创建类类型的对象的时候,都要执行类中的构造函数。而当构造函数中分配了资源之后,需要一个相应的操作这些资源释放出去,这就需要析构函数。 一般来说,在有多个类的程序中,先实现的类会先调用构造函数,...
  • 创建文件是一种非常常见的IO操作,在这一小节中我们学习如何在java中创建文件的几个方法。...当初始化File对象时,需要提供一个文件名,然后调用createNewFile()方法来在Java中创建新文件。如果创建新文件成功,则...
  • 创建和销毁对象

    2016-06-22 20:03:10
    1.考虑用静态工厂发方法代替构造器  提供静态工厂方法较之提供公有构造器,具有如下几...静态工厂方法与构造器不同的第二大优势在于,不必每次调用它们的时候都创建一个新对象。可以构建好的实例缓存起来,进行重
  • (P36)对象动态创建

    2020-10-09 23:17:42
    反射技术就是在运行,动态创建对象,动态调用对象的方法,动态操作对象的属性; 要实现反射,需要给每个类添加元数据,这些元数据就是类的方法与属性; 我们这里只讲动态创建对象,即:对原有的类不做任何更改,只...
  • 拷贝构造函数时一个特殊的成员函数,名字与类名相同,参数只含有一个const修饰的对象的引用,目的:在创建新对象时将已存在的对象完全拷贝给创建的新对象。只能在实例化对象时调用。 class Date { public: Date()...
  • 第一种方式: 工厂方法 能创建并返回特定类型的对象的工厂函数(factory function)。 function createCar(sColor){ var oTempCar = new ...调用此函数将创建新对象,并赋予它所有必要的属性。使用此方法
  • 对象1

    2019-06-03 17:20:50
    创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初值。虽然上述构造函数调用后,对象已经有一个初始值。 但不能其称为对象成员的初始化。构造函数体中的语句只能其称为赋初值,而不能...
  • 对象成员的初始化是通过调用构造函数来完成的,即一个对象成员的初始化“大对象”被创建时一同被创建的。 具体方法:定义"大对象"所在类的构造函数,在成员初始化列表中将参数传递到"小对象"成员的构造函数中。...
  • 创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 构造函数体中的语句只能其称作为赋初值,而不能称作初始化,因为初始化只能初始化一次,而构造函数体内可以多次赋值 1.2、初始化...
  • 不必每次调用创建新的对象(同一对象重复使用)  3.返回的类型可以是原返回类型的任何子类型对象  4.简化创建对象时的代码  缺点:  1.如果不含有公开的构造器,就不能被子化  2.和普通的...
  • 创建线程的另一个途径是创建一个类来扩展Thread类,然后创建类的实例。 当一个类继承Thread,它必须重载run()方法,这个run()方法是线程的入口。它也必须调用start()方法去启动线程执行。下面用扩展thread...
  • 一. 使用静态工厂方法代替构造器 1. 一个对外提供获取自身实例对象的方法:... 可以不用在每次调用时创建一个对象,可以使用预先构建好的对象,或构建好的对象缓存起来,进行重复利用,适用于经常请求创建..
  • 第一条:考虑用静态工厂方法...相比于构造器,不必再每次调用时创建一个新对象 不可变可以预先创建好实例,或者构件好的实例缓存起来,从而避免重复创建对象。此方法类似于Flyweight模式。如果程序经常请...
  • ruby 对象、变量

    2015-04-11 14:10:56
    (1)initialize 方法 ,initialize是一个特殊方法,默认为私有,在调用new创建一个 新对象时,Ruby首先分配一些内存来保存未初始化的对象,然后调用对象的 initialize方法, (2)inspect方法 默认对象的ID和实例...
  • 拷贝构造函数用于一个对象复制到新创建对象中。它的函数原型: Class_A(const Class_A&); 需要注意的是它的参数类型必须是引用,形如Class_A(const Class_A),相当于按值传递,会调用类的拷贝构造函数,...
  • C++对象(下篇)

    2018-10-31 10:48:37
    创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值   虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能其称作为对象成员的初始化,构造数体中的语句只能其称作...
  • ) 这一步是为了保证在查看子类的实例化对象的 constructor 属性,看到的是子类的定义,而不是其父类的定义。 接下来,通过对 o.method1() 调用的结果我们会看到,子类继承来的公有实例方法中,如果调用了私有实例...
  • Thread用于表示单独的控制线程。语法:t=Thread(group=None,target=None,name=...target:一个可调用对象,线程启动,run()方法将调用对象 name:线程名称,默认创建一个“Thread-N”格式的唯一名称。 arg...
  • 对象的行为

    2016-07-03 10:40:21
    构造函数:是一个特殊函数,该函数创建对象时运行,该函数返回类i型固定为该类的类型。若没有手动书写构造函数,编译器会使用默认的构造函数,默认构造函数无参无函数体 构造函数声明语法: 访问修饰符 类名 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,322
精华内容 528
关键字:

创建新对象时将调用类的