初始化列表

C++ 构造方法

和自甴很熟 提交于 2019-11-27 01:26:04
1、构造方法的作用是设置数据成员的初始值。 2、定义一个类Person的实例person的时候,必定会调用Person的构造方法。调用构造方法分为两个步骤:第一步使用初始化列表,第二步在构造方法内部对成员赋值。 3、对于初始化列表,肯定会执行。如果用户没有显式的调用,就会隐式的调用。然后才执行第二步,在构造方法内部赋值。 4、对于初始化列表,对于隐式或者显式中没有初始化的成员,成员的取值取决于下面的情况:   a、如果成员是类类型,使用默认构 造方法。(注:对于这种情况,必须保证成员具有默认构造方法)   b、如果是内置类型,分为下面两种情况:     b1、person是全局变量,初始化为0     b2、person是局部变量,不初始化,为oxcccccccc 5、对成员设置一个初始值,在第一步或者在第二步都能达到同样的效果。但是下面几种情况必须在第一步做:   a、const对象   b、引用类型的对象   为什么?因为const对象和引用类型的对象必须进行初始化,因此必须在初始化列表中进行。 注:0xcccccccc:没有初始化,调试的时候都是这个东西,程序不能访问这个地址。   0x00000000:是Null,不指向任何东西。 转载于:https://www.cnblogs.com/nzbbody/p/3365572.html 来源: https://blog.csdn

C++ 构造和析构

别说谁变了你拦得住时间么 提交于 2019-11-27 01:21:09
1、继承关系可认为,子类在父类的基础上进行。从这个角度讲,可把它认为穿衣脱衣的过程。穿衣是:先穿内衣,再穿外套。脱衣是:先脱外套,在脱内衣。构造是:先调用父类构造方法,再调用子类构造方法。析构是:先调用子类析构方法,再调用父类析构方法。 2、构造可分为两个步骤:初始化列表和方法内赋值。前者的使用场景是:初始化,即copy构造。后者的使用场景是:赋值,即copy赋值。   a、对于类类型,如果没有在初始化列表中显式初始化,会进行隐式初始化,调用默认构造方法。因此,没有默认构造方法的类成员,必须显式初始化。   b、对于基本类型,如果没有在初始化列表中显式初始化,不会进行隐式初始化。初始值依赖于对象的作用域:局部对象不被初始化,为0xcccccccc(并不是初始化为随机值),全局对象初始值为0。   c、在初始化列表或者赋值阶段,都可以达到同样的效果。但是,对于类类型,如果在赋值阶段进行,相当于执行了一次copy构造(调用默认构造方法),一次copy赋值,因此,对于类类型,应该使用初始化列表,效率高。对于基本类型,因为没有隐式初始化,在初始化列表或者赋值阶段,都是一样的。   d、但是有三种情况必须在初始化列表中进行:d1、没有默认构造方法的类类型,因为没有显示初始化,会进行隐式初始化,调用默认构造方法,导致编译出错;d2、const对象,必须初始化;d3、引用类型,必须初始化。  

C++初始化与赋值

寵の児 提交于 2019-11-27 00:12:11
先来个区别说明:赋值操作是在两个已经存在的对象间进行的,而初始化是要创建一个新的对象,并且其初值来源于另一个已存在的对象。编译器会区别这两种情 况,赋值的时候调用重载的赋值运算符,初始化的时候调用拷贝构造函数。如果类中没有拷贝构造函数,则编译器会提供一个默认的。这个默认的拷贝构造函数只是 简单地复制类中的每个成员。 下面看例子。 c++中初始化和赋值操作差别是很大的。 对于基本数据类型差别不大: 比如: int a = 12; // initialization, copy 0X000C to a a = 12; // assignment, copy 0X000C to a 但是对用户自定义的数据类型比如String 初始化和赋值就差别很大: class String ...{ public: String( const char *init ); // intentionally not explicit! ~String(); String( const String &that ); String &operator =( const String &that ); String &operator =( const char *str ); void swap( String &that ); friend const String // concatenate

C++--第10课 - 构造与析构 - 下

跟風遠走 提交于 2019-11-27 00:11:26
第10课 - 构造与析构 - 下 1. C++中的对象组合 C++中提供了初始化列表对成员变量进行初始化 语法规则: Constructor::Contructor() : m1(v1), m2(v1,v2), m3(v3) { // some other assignment operation } 注意: 成员变量的初始化顺序与声明的顺序相关,与在初始化列表中的顺序无关。初始化列表先于构造函数的函数体执行。 #include <stdio.h> class M { private: int mI; public: M(int i) { printf("M(int i), i = %d\n", i); mI = i; } int getI() { return mI; } }; class Test { private: const int c; //类定义里面的成员变量不允许赋初值。 M m1; M m2; public: Test() : c(1), m2(3), m1(2) { printf("Test()\n"); } void print() { printf("c = %d, m1.mI = %d, m2.mI = %d\n", c, m1.getI(), m2.getI()); } }; //这个程序若不Test() : c(1), m2(3), m1(2)这样写

Java类的封装继承多态 ---总结

♀尐吖头ヾ 提交于 2019-11-26 21:58:19
Java类的封装继承多态 OOP思想不再多做介绍 下面对一些重点描述一下 Java的权限修饰符 修饰实例方法、类方法、类变量、实例变量的: private public default protected 修饰类的: public private 局部变量没有访问权限符 本身就是一个方法内部的变量,仅该方法可以访问 特别注意的是private private只支持自身类内部方法的访问 即使是子类也不行,也不准访问 Java类概述 属性(Field) 也叫成员变量 静态属性(类属性): static 实例属性 (一般在构造器里初始化,也可以用初始化代码块初始化) (涉及Java的类加载机制、Java的类变量、实例变量访问、设计模式) 注意成员变量和局部变量的区别 注意类变量和实例变量的区别 构造器(Constructor) 隐式构造器(当类内部没有提供构造器时,JVM自动提供的一个隐式的无参的构造器,默认值一般为0或NULL) 显示构造器:程序员提供在类内部的构造器 1.与类同名 2.无返回值 3.允许重载 (即允许多个同名构造器) 4.一般初始化实例变量 5.和new搭配 6.允许使用this关键词 ,但是this(…)也是调用已有的构造器,也就是参数列表至少要匹配 一旦 使用this构造器,就得放在 整个构造器的最前面 7.允许调用父类的构造器:super(…) 一旦

c++创建对象过程详解

ぃ、小莉子 提交于 2019-11-26 16:15:41
创建对象的过程 1.分配内存空间 2.初始化成员变量 3.调用构造方法 1. 分配内存空间(A a 和 new A的不同) 对于 全局对象 , 静态对象 以及 分配在栈区域内的对象 ,对它们的内存分配是在 编译阶段 就完成了, 而对于分配在 堆区域内的对象 ,它们的分配是在程序 运行阶段 完成的 。 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 内存空间的分配过程中需要确定分配空间的大小,即类对象的大小,这个问题是编译器根据类数据成员来进行分配。 是否有足够的内存空间来满足分配,对于不同的情况我们需要具体问题具体分析:全局对象和静态对象。编译器会为他们划分一个独立的段(全局段)为他们分配足够的空间,一般不会涉及到内存空间不够的问题。分配在栈区域的对象。栈区域的大小由编译器的设置决定,不管具体的设置怎样,总归它是有一个具体的值,所以栈空间是有限的,在栈区域内同时分配超过空间大小的对象会导致栈区域溢出,由于栈区域的分配是在编译阶段完成的,所以在栈区域溢出的时候会抛出编译阶段的异常

C++ const 引用 指针

折月煮酒 提交于 2019-11-25 23:40:06
先简单回忆一下常量的性质: Copy int main() { const int buffSize = 512; buffsize = 512; //× buffSize是常量 } 初始化时: Copy const int i = get_val(); //√ 运行时初始化 const int j = 42; //√ 编译时初始化 const int k; //× k未经初始化 当用一个对象去初始化另外一个对象,他们是不是const就无关紧要 Copy int i = 42; const int ci = i; int j = ci; ci是整形常量,但ci的常量特征仅仅在执行 改变ci 的操作时才会发挥作用 const和引用 # 对常量的引用 # ·把引用绑定到const对象上,称之为对常量的引用 对常量的引用不能用作修改它所绑定的对象,引用 及其 引用的对象 都是常量 Copy const int ci = 1024; const int &r1 = ci; 需要注意的是: Copy const int ci = 1024; const int &r1 = ci; r1 = 42; //× r1是对常量的引用 int &r2 = ci; //× r2是一个非常量引用,ci是一个常量对象 因为不允许把 ci 用作修改它所绑定的对象,所以也不能通过引用去改变ci(假设第四句合法

C++之使用对象前先初始化

↘锁芯ラ 提交于 2019-11-25 22:51:35
1.内置类型 当需要使用一个int类型的变量时,我们应该先对其进行初始化,例如: int x=0; //..... 在后续中使用x变量 2.一个类里面的成员变量初始化 初始化类里面的成员变量时,尽量使用初始化列表对其进行初始化,例如: class Forest { public: Forest(const std::string str,int num); private: string m_forestName; int m_treeNum; } 1)当用以下方式实现构造函数时,: Forest(const std::string str,int num) { m_forestName=str; // 这属于赋值操作,而非初始化操作,初始化在进入到构造函数体之前已经被初始化 m_treeNum=num; } 2)因此可以尽量使用初始化列表进行初始化,实现如下: Forest(const std::string str,int num) :m_forestName(str), //这种属于初始化 m_treeNum(num) { } 第二种相对于第一种来说要高效一些,原因如下: 第一种首先调用default构造函数为m_forestName设初值,然后立刻再赋予新值;第二种在初始化列表中针对各个成员变量而设的实参,被拿去直接作为各成员变量的实参 来源: https://www

C++应用程序性能优化(三)——C++语言特性性能分析

半世苍凉 提交于 2019-11-25 21:08:27
C++应用程序性能优化(三)——C++语言特性性能分析 一、C++语言特性性能分析简介 通常大多数开发人员认为,汇编语言和C语言比较适合编写对性能要求非常高的程序,C++语言主要适用于编写复杂度非常高但性能要求并不是很高的程序。因为大多数开发人员认为,C++语言设计时因为考虑到支持多种编程模式(如面向对象编程和范型编程)以及异常处理等,从而引入了太多新的语言特性。新的语言特性往往使得C++编译器在编译程序时插入了很多额外的代码,会导致最终生成的二进制代码体积膨胀,而且执行速度下降。 但事实并非如此,通常一个程序的速度在框架设计完成时大致已经确定,而并非因为采用C++语言才导致速度没有达到预期目标。因此,当一个程序的性能需要提高时,首先需要做的是用性能检测工具对其运行的时间分布进行一个准确的测量,找出关键路径和真正的性能瓶颈所在,然后针对性能瓶颈进行分析和优化,而不是主观地将性能问题归咎于程序所采用的语言。工程实践表明,如果框架设计不做修改,即使使用C语言或汇编语言重新改写,也并不能保证提高总体性能。 因此,遇到性能问题时,首先应检查和反思程序的总体架构,然后使用性能检测工具对其实际运行做准确的测量,再针对性能瓶颈进行分析和优化。 但C++语言中确实有一些操作、特性比其它因素更容易成为程序的性能瓶颈,常见因素如下: (1)缺页 缺页通常意味着要访问外部存储