类初始化 构造函数 拷贝构造函数

原创 2007年10月01日 15:12:00

  1.类里面的任何成员变量在定义时是不能初始化的。  
  2.一般的数据成员可以在构造函数中初始化。  
  3.const数据成员必须在构造函数的初始化列表中初始化。   because const members may only be initialized, never assigned.因为const类型只能初始化而不能赋值。
  4.static   要在类的定义外面初始化。  

c++Explicit Initialization(显式初始化)的两种方法:
1. type-name name( initializer1, initializer2, ... initializer)
调用类构造函数(不一定是默认构造函数)

什么是默认构造函数?

“默认构造函数”是能够被无参数调用的构造函数。

在定义类时,如果没有定义构造函数,则当需要构造函数时,编译器将自动生成一个不带参数的构造函数,此构造函数成为默认构造函数。但如果用户为类定义了构造函数(不一定是默认构造函数,默认构造函数必须满足能够被无参数调用),则实例化类对象时将使用用户定义的构造函数,编译器不会生成构造函数。

定义类构造函数列表初始化的几种形式:

class B;
class A : public BaseClass
{
 private:
       int value1;
       int value2;
       B b; 
};
1.     初始化为常量(const)
定义:A() : BaseClass(100,200),value1(50),value2(50),b(10,10){};
调用:A a;  (无参数调用,是默认构造函数)
2.   参数赋初值
A(int i=1,n=2):value1(i),value2(n){};
调用:A a;  (无参数调用,是默认构造函数)
A a(3,4);或
int x=7,y=8; A a(x,y);
3.     利用参数列表初始化(非常量)
A(int i,int n,int m,int k) : BaseClass(i,n),value1(m),value2(k),b(n,m){};
调用:A a(1,2,3,4);或
int x=2,y=1,z=7,w=8; A a(x,y,z,w);
调用A a;将出错,不是默认构造函数。

    上面写成BaseClass(100,200),BaseClass(i,n),说明了类BaseClass构造函数的形式为带有两个参数。

2. type-name name = value

调用拷贝构造函数
拷贝构造函数定义形式:
class-name(class-name&);Can accept a single argument of reference to same class type
(注意不是name = value,这是赋值运算,不是初始化,它调用operator=)
默认拷贝构造函数和默认operator=带来的问题:
1。lose memory, the memory that some pointer point to was never deleted
2.  will delete the memory still pointed to by other pointer.
the solution:Declare a copy constructor and an assignment operator for classes with dynamically allocated memory.
 
Explicitly disallow use of implicitly generated member functions you don't want.
 
The solution is to declare the function, operator= in this case, private. By declaring a member function explicitly, you prevent compilers from generating their own version, and by making the function private, you keep people from calling it.
 

Java的类初始化的详解

前两周看到了Java编程思想的初始化及类的加载那里,一直没找时间把它总结出来,对于初始化和类的加载过程,感觉Java编程思想讲的较浅还不够深入,于是我结合Java疯狂讲义2和人家博客后,就打算按照自己...
  • xuguoli_beyondboy
  • xuguoli_beyondboy
  • 2014年12月29日 23:02
  • 1676

深入浅出Java类和对象的初始化

最近项目调试中出现了类初始化的问题,虽然事后证明是Eclipse的问题,但也暴露了对Java初始化机制的欠缺,在此翻译一篇javaworld上的文章。这篇文章很好,深入浅出地介绍了Java的初始化细节...
  • MOLIILOM
  • MOLIILOM
  • 2016年01月03日 21:23
  • 1125

Java类什么时候开始初始化

Java类什么时候开始初始化
  • luoxianfeng89
  • luoxianfeng89
  • 2015年10月09日 22:44
  • 998

关于父类和子类的初始化问题

在Java中创建一个类的对象时,如果该类存在父类,则先调用父类的构造方法,然后再调用子类的构造方法。如果父类没有定义构造方法,则调用编译器自动创建的不带参数的默认构造方法。如果父类定义了public的...
  • qq_22654611
  • qq_22654611
  • 2016年09月28日 14:16
  • 1483

c++类对象初始化方式总结

在《inside the c++ object model》一书中谈到copy constructor的构造操作,有三种情况下,会以一个object的内容作为另一个object的初值: 第一种情况:...
  • caoyan_12727
  • caoyan_12727
  • 2016年09月08日 11:39
  • 7840

类对象数组初始化(三种方法)

参考自《More Effective C++中文版》     类对象数组初始化参考自《More Effective C++中文版》     类对象数组初始化     如有...
  • u012078139
  • u012078139
  • 2013年09月13日 21:11
  • 7140

类的加载、连接与初始化过程的详细分析(上)

前面一个博客文章介绍过了类从加载到可以被使用经过了加载、连接、初始化三个过程,下面对每个过程所发生的事情做详细分析。 一、类加载阶段         1.类加载方式         类的加载指...
  • sunfeizhi
  • sunfeizhi
  • 2015年12月20日 22:40
  • 1377

java中父类和子类初始化顺序

顺序 1. 父类中静态成员变量和静态代码块 2. 子类中静态成员变量和静态代码块 3. 父类中普通成员变量和代码块,父类的构造函数 4. 子类中普通成员变量和代码块,子类的构造函数 其中“和”字两...
  • yuxin6866
  • yuxin6866
  • 2016年11月09日 23:39
  • 1611

Java 类加载与初始化

目录 类加载器动态加载链接初始化示例 类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如何加载的,这对后面理解java其它机制将有重要作用。 ...
  • oVoo_8
  • oVoo_8
  • 2015年10月09日 22:54
  • 1994

Java系列笔记(1) - Java 类加载与初始化

http://www.cnblogs.com/zhguang/p/3154584.html
  • Baple
  • Baple
  • 2014年09月02日 10:33
  • 2017
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类初始化 构造函数 拷贝构造函数
举报原因:
原因补充:

(最多只允许输入30个字)