精华内容
下载资源
问答
  • C++对跨编译单元的名字空间级对象初始化顺序并未做定义。...如果必须使用全局的、名字空间作用域的或者静态的类对象,一定要仔细地对其进行初始化,同时确保不产生相互依赖。注意:名字空间作用域中...

      C++对跨编译单元的名字空间级对象初始化顺序并未做定义。不仅如此,在调用对象自身的构造函数之前,编译器已经对名字空间级对象做了”零初始化”,即将内存值全部置零(不同于未初始化)。因此,绝对不能假定名字空间级对象的初始化顺序,更不能让名字空间级对象的初始化过程互相依赖。如果必须使用全局的、名字空间作用域的或者静态的类对象,一定要仔细地对其进行初始化,同时确保不产生相互依赖。注意:名字空间作用域中的对象、静态成员对象或者跨线程或跨进程共享的对象会减少多线程和多处理器环境中的并行性,往往是产生性能和可伸缩性瓶颈的源头。

      编译单元:当一个c或cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有必要信息的单个源文件,这个源文件就是一个编译单元。这个编译单元会被编译成为一个与cpp 文件名同名的目标文件(.o或是.obj) 。连接程序把不同编译单元中产生的符号联系起来,构成一个可执行程序。

    相关文章:

    [C++再学习系列] 变量与声明时初始化

    [C++再学习系列] 全局或静态变量(对象)的初始化

    展开全文
  • 不是一个实体,而是一种抽象类型,所以不占用系统...需要注意,同一个建立的不同对象,数据之间是不能相互访问。例如: class A; A a,b; 虽然建立了两个对象,拥有相同成员,但是数据是不能相互访问。...

    类不是一个实体,而是一种抽象的类型,所以不占用系统的存储空间,所以是不会容纳数据的。

    只有当建立对象之后,系统才会对其分配内存。每一个对象在建立时候,应该对其初始化。

    需要注意,同一个类建立的不同对象,数据之间是不能相互访问的。

    例如: class A;   A a,b; 虽然建立了两个对象,拥有相同的成员,但是数据是不能相互访问的。

    展开全文
  • 构造器重载允许 Java 里包含多个初始化逻辑,从而允许使用不同的构造器来初始化 Java 对象。在看本篇之前先了解 使用构造器执行初始化 。 1、构造器的重载 ​ 构造器重载和方法重载基本相似:概况起来就是名称...

    前言:同一个类里具有多个构造器,多个构造器的形参列表不同,即被称为构造器重載。构造器重载允许 Java 类里包含多个初始化逻辑,从而允许使用不同的构造器来初始化 Java 对象。在看本篇之前先了解 使用构造器执行初始化


    1、构造器的重载

    ​ 构造器重载和方法重载基本相似:概况起来就是名称相同参数列表不同。要求构造器的名字相同,这一点无须特别要求,因为构造器必须与类名相同,所以同一个类的所有构造器名肯定相同。为了让系统能区分不同的构造器,多个构造器的参数列表必须不同。

    1.1、代码表示

       public class ConstructorOverload {
        public String name;
        public int count;
    
        /**
         * 提供无参数的构造器
         */
        public ConstructorOverload() {
    
        }
    
        /**
         * 提供一个参数的构造器,对构造器返回的对象进行初始化
         *
         * @param name 名称
         */
        public ConstructorOverload(String name) {
            this.name = name;
        }
    
        /**
         * 提供两个参数的构造器,对构造器返回的对象进行初始化
         *
         * @param name  名称
         * @param count 数量
         */
        public ConstructorOverload(String name, int count) {
            this.name = name;
            this.count = count;
        }
    
        public static void main(String[] args) {
            // 通过无参数的构造器创建 ConstructorOverload 对象
            ConstructorOverload con1 = new ConstructorOverload();
            // 通过一个参数的构造器创建 ConstructorOverload 对象
            ConstructorOverload con2 = new ConstructorOverload("西瓜");
            // 通过两个参数构造器创建 ConstructorOverload 对象
            ConstructorOverload con3 = new ConstructorOverload("玉米", 100);
    
            // 开始调用方法
            System.out.println("名称:" + con1.name);
            System.out.println("名称:" + con2.name);
            System.out.println("名称:" + con3.name + "\t 数量:" + con3.count);
        }
    }
    

    1.2、运行结果

    名称:null
    名称:西瓜
    名称:玉米     数量:100
    

    2、构造器间的相互调用

    ​ 上面的 ConstructorOverload 类提供了两个重载的构造器,两个构造器的名字相同,但形参列表不同。系统通过 new 调用构造器时,系统将根据传入的实参列表来决定调用哪个构造器。如果系统中包含多个构造器,其中一个构造器的执行体里完全包含另一个构造器的执行体,如下图所示:

    ​ 从图中可以看出,构造器 B 完全包含了构造器 A 。对于这种完全包含的情况分两种:

    • 方法之间:如果是两个方法之间存在这种关系,则可在方法 B 中直接调用方法 A 。

    • 构造器之间:构造器不能直接被调用,构造器必须使用 new关键字来调用。但一旦使用 new 关键字来调用构造器,将会导致系统重新创建一个对象

    2.1、代码表示

    ​ 为了在构造器 B 中调用构造器 A 中的初始化代码,又不会重新创建一个 Java 对象,可以使用 this 关键字来调用相应的构造器。下面代码实现了在一个构造器中,直接使用另一个构造器的初始化代码。

       /**
     * @author Administrator
     */
    public class ConstructorInvoke {
        public String name;
        public int count;
        public double weight;
    
        /**
         * 无参构造
         */
        public ConstructorInvoke() {
    
        }
    
        /**
         * 两个参数的构造器
         *
         * @param name  名称
         * @param count 数量
         */
        public ConstructorInvoke(String name, int count) {
            this.name = name;
            this.count = count;
        }
    
        /**
         * 三个参数的构造器
         *
         * @param name   名称
         * @param count  数量
         * @param weight 重量
         */
        public ConstructorInvoke(String name, int count, double weight) {
            /*this.name = name;
            this.count = count;*/
    
            // 通过 this 调用另一个重载的构造器的初始化代码
            this(name, count);
            // 下面 this 引用该构造器正在初始化的 Java 对象
            this.weight = weight;
        }
    
        public static void main(String[] args) {
            ConstructorInvoke radish = new ConstructorInvoke("萝卜", 200, 2);
            System.out.println("名称:" + radish.name + "\t数量:" + radish.count + "\t" + "重量" + radish.weight);
        }
    }
    

    2.2、运行结果

    名称:萝卜    数量:200    重量2.0
    

    ​ 上面的 ConstructorInvoke 类里包含了三个构造器,其中第三个构造器通过 this 来调用另一个重载构造器的初始化代码。程序中 this (name, color ); 调用表明调用该类另一个带两个字符串参数的构造器。

    ​ 使用 this 调用另一个重载的构造器,只能在构造器中使用,而且必须作为构造器执行体的第一条语句 ,使用 this调用重载的构造器时,系统会根据this 后括号里的实参来调用形参列表与之对应的构造器。

    3、知识补充

    3.1、为什么要用 this 来调用构造器,而不是直接复制代码?

    ​ 从图1中其实就可以知道为什么要调用构造器,而不是复制代码了。为啥?😉 往下看 baby

    ​ 因为软件是一个需要不断更新的产品,如果有一天需要更新图1中构造器 A 的初始化代码,假设构造器 B、构造器 C 都含有相同的初始化代码,则需要同时打开构造器 A、构造器 B、构造器 C …… 的代码进行修改;反之,如果构造器 B、构造器 C …… 是通过 this 调用了构造器 A 的初始化代码,则只需要打开构造器 A 进行修改既可。

    • 如果仅仅从软件功能实现上来看:这样复制、粘贴确实可以实现所想要的功能;
    • 从软件工程的角度来看:这样做是相当糟糕的。

    ​ 在软件开发里有一个规则:不要把相同的代码段书写两次以上(就是冗余代码,现在有印象了吧(∩_∩))。因此,尽量避免相同的代码重复出现,充分复用每一段代码(毕竟按代码行数算钱的时代已经过去 ( ̄▽ ̄)),既可让程序代码更加简洁,也可以降低软件的维护成本。

    展开全文
  • 而同一个类的不同对象的实例数据成员相互独立,占有各自的存储空间。 3、静态变量不在构造函数中初始化,必须在类外的文件作用域中定义静态数据成员,即为它们分配存储空间。 4、在类之外,需要使用类名...

    C++中类的静态成员与实例成员的区别

    1、有static修饰的成员变量或成员函数称为静态成员

    2、在内存中,类的静态数据成员占有一块特定的内存空间,被该类的所有实例(对象)共享。而同一个类的不同对象的实例数据成员相互独立,占有各自的存储空间。

    3、静态变量不能在构造函数中初始化,必须在类外的文件作用域中定义静态数据成员,即为它们分配存储空间。

    4、在类之外,需要使用类名和域解析操作符:: 访问类的静态数据成员和共有函数成员。

    5、在静态函数中,只能访问类的静态成员变量和静态函数,而不能访问类的实例数据成员。

     

    静态函数和普通函数的本质区别:编译时,编译器没有为静态函数指定this参数,而普通函数有this参数。

     

     

    转载于:https://www.cnblogs.com/pjl1119/p/9643715.html

    展开全文
  • 句柄

    2012-02-28 11:33:00
    代理,这个类能让我们在一个容器中存储类型不同相互关联的对象。创建代理将会复制所代理的对象,如果想避免这些复制该怎么办? 通常参数和返回值是通过复制自动传递的,用引用传递参数可以避免这样的复制,但是...
  • 第1章 声明和初始化 基本类型 1.1 我该如何决定使用哪种整数类型? 1.2 为什么不精确定义标准类型大小? 1.3 因为C语言没有精确定义类型大小,所以我一般都用typedef定义int16和int32。然后根据实际机器...
  • 1、易于交换产品系列,由于具体工厂,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。 2、它让具体的创建实例过程与...
  • 《你必须知道495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    书中列出了C用户经常问400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面主题,并分别给出了解答,而且结合代码示例阐明要点。 《你必须知道495个C语言问题》结构...
  • ~第1章 声明和初始化 1 基本类型 1 1.1 我该如何决定使用哪种整数类型? 1  1.2 为什么不精确定义标准类型大小? 2 1.3 因为C语言没有精确定义类型大小,所以我一般都用typedef定义int16和int32。然后...
  • 使用它也非常简单,直接依赖注入,然后通过 init 方法进行初始化simpleDao.jsvar SimpleDao = function() {  this.$id = "simpleDao";  this.$init = "init";  this.$domainDaoSupport = null; } ...
  • //初始化构造函数 virtual ~Matrix(); // 析构函数 //类型转换函数 operator int(); operator double(); operator char* (); //私有域获取函数 DATATYPE getDataType(); INT getNumDims(); ...
  •  23、说明:初始化表table1 TRUNCATE TABLE table1  24、说明:选择从10到15记录 select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc 随机选择数据库记录方法...
  • Java代码实例

    2016-06-21 22:44:51
    15.3.2 创建静态内部类的对象 332 15.3.3 静态/非静态内部类的区别 333 15.4 匿名内部类 334 15.4.1 基于继承的匿名内部类 334 15.4.2 基于接口实现的匿名内部类 335 15.4.3 匿名内部类的初始化 337 ...
  • 在XML中,就是要将网页也作为一个对象来操作和控制,我们可以建立自己的对象和模板。与对象进行交流,如何命令对象,就要用到API。API全称Application Programming Interface,它是访问和操作对象的规则。而DOM就是...
  • Java SE 6.0编程指南 源码

    热门讨论 2012-05-18 13:40:45
    15.3.2 创建静态内部类的对象 332 15.3.3 静态/非静态内部类的区别 333 15.4 匿名内部类 334 15.4.1 基于继承的匿名内部类 334 15.4.2 基于接口实现的匿名内部类 335 15.4.3 匿名内部类的初始化 337 ...
  • 因 此在赋值后应该及时销毁或者初始化 L2,以免发生不可预见错误。 比较 使用 Contains 方法。 ArrayList Array1=new ArrayList(); Array1.Add("as"); bool b1=Array1.Contains("as"); MessageBox.Show(b1....
  • 由于具体工厂,例如IFactory factory=new AccessFactory(),在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。我们的设计不...
  • 在这一章最后,我们将更贴近地观察初始化过程:自动成员初始化、指定成员初始化初始化的顺序、static(静态)初始化以及数组初始化等等。 (5) 第5章:隐藏实现过程 本章要探讨将代码封装到一起方式,以及在库...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    表示在某一时刻类的具体实例和这些实例之间的具体连接关系 类 与 对象 关系 类 与 对象 关系 类图和对象图的区别 包 包 一种分组机制,把各种各样的模型元素通过内在的语义连在一起成为一个整体就叫做包 ...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    第九章 面向对象的程序设计 .101 9.1 面向对象的基本概念.101 9.2 对象的模型技术 .103 9.3 面向对象的分析 .105 9.4 面向对象的设计 .107 9.5 小 结 .110 第十章 .112 10.1 声 明 .112 ...
  • C#微软培训资料

    2014-01-22 14:10:17
    第九章 面向对象的程序设计 .101 9.1 面向对象的基本概念.101 9.2 对象的模型技术 .103 9.3 面向对象的分析 .105 9.4 面向对象的设计 .107 9.5 小 结 .110 第十章 .112 10.1 声 明 .112 ...
  • 答:主要软件开发方法有:结构开发方法、Jackson(JSP、JSD)方法、原型开发方 法、维也纳开发方法(VDM)和面向对象的开发方法。 6. 软件生命期各阶段任务是什么? 答:软件生命期瀑布模型分为六个阶段: ...
  • 18.6 检测定制attribute时不创建从Attribute派生的对象 18.7 条件attribute 第19章 可空值类型 19.1 C#对可空值类型的支持 19.2 C#的空接合操作符 19.3 CLR对可空值类型的特殊支持 19.3.1 可空值类型的装箱...
  • // 初始化 kcp对象,conv为一个表示会话编号整数,和tcp conv一样,通信双 // 方需保证 conv相同,相互的数据包才能够被认可,user是一个给回调函数指针 ikcpcb *kcp = ikcp_create(conv, user); 设置回调...
  • 2-11 在一个for循环中,可以初始化多个变量吗?如何实现? 解: 在for循环设置条件的第一个";"前,用,分隔不同的赋值表达式。 例如: for (x = 0, y = 10; x ; x++, y++) 2-12 执行完下列语句后,n的值为多少? ...
  • 4.1.4 讲讲类的实例顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当new的时候,他们的执行顺序。 4.1.5 用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么...

空空如也

空空如也

1 2 3
收藏数 53
精华内容 21
关键字:

不同的类的对象能相互初始化