类与类的初始化

面向对象(Object-Oriented):是一种按照人们认识客观世界的思维方式,采用基于对象(实体)的概念建立抽象的模型,模拟客观世界分析、设计、实现软件的方法。

类(Class):具有相同属性、操作的抽象的集合。

类的成员:

类包括成员变量和成员函数,其具有3种属性私有(private)、公有(public)和保护(protected)。

private:只能被该类中的函数访问,被友元函数访问;

  不能被任何其他访问,该类的对象也不能访问。

public:可以被该类的函数、子类的函数、友元函数访问,也可以被该类的对象访问。

protected:可以被该类的函数、子类的函数、友元函数访问。

  不能被该类的对象访问。

类的创建及初始化:

创建类时要对类进行声明和定义。

构造函数(Constructors):是一种特殊的成员函数。主要用来在创建对象时初始化对象。

  构造函数唯一的语法限制是不能指定返回类型。构造函数名与类名同名。

  构造函数包括默认构造函数、拷贝构造函数。

默认构造函数(Default Constructor):在类未提供显式打的初始化值时,被用来创建对象的构造函数,默认构造函数无参数。

  当且仅当没有定义任何构造函数时,编译器才会提供默认的构造函数,为类定义了构造函数(有参数)后,则必须为它提供显式默认的构造函数。

  给已有的构造函数的所有参数提供默认值。

 1 # ifndef _NUMBER_H_
 2 # define _NUMBER_H_
 3
 4 class Number
 5 {
 6     public:
 7         Number(int a = 0, double b = 0.0);
 8 //        Number(int , double );
 9 //        Number();
10     protected:
11     private:
12         int number_a;
13         double number_b;
14 };
15
16 # endif // _NUMBER_H_

number.h

 1 # include "number.h"
 2
 3 Number::Number(int a, double b)
 4 {
 5     number_a = a;
 6     number_b = b;
 7 }
 8
 9 //Number::Number()
10 //{
11 //    number_a = 0;
12 //    number_b = 0.0;
13 //}

number.cpp

1 # include <iostream>
2 # include "number.h"
3
4 int main()
5 {
6     Number a(1, 1.1);
7     Number b;
8     return 0;
9 }

main.cpp

result:

0 errors, 0 warnings  

  通过重载来定义另一个构造函数。

 1 # ifndef _NUMBER_H_
 2 # define _NUMBER_H_
 3
 4 class Number
 5 {
 6     public:
 7 //        Number(int a = 0, double b = 0.0);
 8         Number(int , double );
 9         Number();
10     protected:
11     private:
12         int number_a;
13         double number_b;
14 };
15
16 # endif // _NUMBER_H_

number.h

 1 # include "number.h"
 2
 3 Number::Number(int a, double b)
 4 {
 5     number_a = a;
 6     number_b = b;
 7 }
 8
 9 Number::Number()
10 {
11     number_a = 0;
12     number_b = 0.0;
13 }

number.cpp

1 # include <iostream>
2 # include "number.h"
3
4 int main()
5 {
6     Number a(1, 1.1);
7     Number b;
8     return 0;
9 }

main.cpp

result:

0 errors, 0 warnings

拷贝构造函数(Copy Constructor):是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。

  拷贝构造函数是由普通构造函数和赋值操作符共同实现的。

  如果在类中没有显式的声明一个拷贝构造函数,那么,编译器会自动生成一个来进行对象之间非static成员的位拷贝。这个隐含的拷贝构造函数简单的关联了所有的类成员。

在C++中,下面三种对象需要调用拷贝构造函数:

  1. 一个对象作为函数参数,以值传递的方式传入函数体。
  2. 一个对象作为函数返回值,以值传递的方式从函数返回。
  3. 一个对象用于给另一个对象进行初始化。

 1 # ifndef _NUMBER_H_
 2 # define _NUMBER_H_
 3
 4 class Number
 5 {
 6     public:
 7 //        Number(int a = 0, double b = 0.0);
 8         Number(int , double );
 9         Number();
10         Number(const Number &);
11         int getNumber_a();
12         double getNumber_b();
13     protected:
14     private:
15         int number_a;
16         double number_b;
17 };
18
19 # endif // _NUMBER_H_

number.h

 1 # include "number.h"
 2
 3 Number::Number(int a, double b)
 4 {
 5     number_a = a;
 6     number_b = b;
 7 }
 8
 9 Number::Number()
10 {
11     number_a = 0;
12     number_b = 0.0;
13 }
14
15 Number::Number(const Number & num)
16 {
17     number_a = num.number_a;
18     number_b = num.number_b;
19 }
20
21 int Number::getNumber_a()
22 {
23     return number_a;
24 }
25
26 double Number::getNumber_b()
27 {
28     return number_b;
29 }

number.cpp

 1 # include <iostream>
 2 # include "number.h"
 3 using namespace std;
 4
 5 int main()
 6 {
 7     Number a(1, 1.1);
 8     Number b(a);
 9     cout << a.getNumber_a() << " , "
10         << a.getNumber_b() << endl;
11     cout << b.getNumber_a() << " , "
12         << b.getNumber_b() << endl;
13     return 0;
14 }

main.cpp

result:

1 , 1.1
1 , 1.1

析构函数(Destructor):也是一种特殊的成员函数,它的作用与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已经调用完毕),系统自动执行析构函数。

  析构函数名也应与类名相同,只是在函数名前加一个取反符"~",以区别于构造函数。

类与类的初始化

时间: 2024-11-06 20:36:59

类与类的初始化的相关文章

【解惑】类与对象的初始化问题

★ 类常量 Java类常量(final修饰) 的值在编译阶段就已经写入了class文件的常量池中(可见<Class文件内容及常量池 >).该类在JVM中运行的任何阶段都不可能改变这个常量值.这也就形成了Java常量定义的两个语法规定:(1) Java类常量必须在类中声明的时候就赋给特定的值.(2) Java类常量绝对不允许赋第二次值. 下面是Java类常量的初始化代码: Java代码 //代码1: 类常量的初始化 public class Init{ //定义类常量ITEM,声明的同时必须赋值

C#类的创建与初始化

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace C_编辑基础 { class Person { public string Name; //因为Name没有赋值,而它是string类型的,所以它的默认值就是Null public int Age; //因为Age和Gender也没有赋值,而它两是int类型的,所以他们两个的默认值为0 public int

分析java类的静态成员变量初始化先于非静态成员变量

分析java类的静态成员变量初始化先于非静态成员变量 依上图中当class字节码文件被jvm虚拟机加载到内存中依次经过 连接 验证:对字节码进行验证 准备:给静态变量分配内存并赋予变量类型各自的默认值(注:基本类型为0或false,对象为null,static final修饰的常量直接赋予相应的值) 解析:类中符号引用转换成直接引用 初始化:为类的静态变量/静态语句块初始化相应的值 而类的初始化契机是:类在被第一次主动使用的情况下,主动使用包括以下6中情况: 使用new关键字实例化对象时. 调用

java类中各成员初始化的顺序

了解java中类各个成员的初始化顺序是非常重要的,这样你可以对类有全局的认识.不说太多,直接看下面的例子 class Father { static{ System. out.println("父类静态代码块初始化" ); } { System. out.println("父类代码块初始化" ); } private static String s=print(); public static String print() { System. out.println

Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序

Java 类的实例变量初始化的过程 静态块.非静态块.构造函数的加载顺序 先看一道Java面试题: 1 public class Baset { 2 private String baseName = "base"; 3 // 构造方法 4 public Baset() { 5 callName(); 6 } 7 // 成员方法 8 public void callName() { 9 // TODO Auto-generated method stub 10 System.out.p

解析Java类和对象的初始化过程

类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来分析的文章更是鲜有所见. 本文主要对类和对象初始化全过程进行分析,通过一个实际问题引入,将源代码转换成 JVM 字节码后,对 JVM 执行过程的关键点进行全面解析,并在文中穿插入了相关 JVM 规范和 JVM 的部分内部理论知识,以理论与实际结合的方式介绍对象初始化和类初始化之间的协作以及可能存在的

Java 反射 类的连接与初始化 [ 转载 ]

Java类的连接与初始化 (及2013阿里初始化笔试题解析) 转自http://www.cnblogs.com/iceAeterNa/p/4876747.html Java虚拟机通过装载.连接.初始化来使得一个Java类型可以被Java程序所使用,如下图所示,其中连接过程又分为验证.准备.解析三个部分.其中部分类的解析过程可以推迟到程序真正使用其某个符号引用时再去解析.   解析过程可以推迟到类的初始化之后再进行,但这是有条件的,Java虚拟机必须在每个类或接口主动使用时进行初始化. 以下为主动

[Java] 类和接口的初始化步骤 - 继承方面

类和接口在初始化化时,处理继承层级的方法不一样. 类继承的初始化:通过引用 static 字段,触发某个类的初始化,则声明该字段的类,以及该类的父类被初始化. 接口继承的初始化:通过引用 static 字段,触发某个接口的初始化,则声明该字段的接口会被初始化,但该接口的父接口不会被初始化. 想了解其他触发类初始化的方法,可参看另一篇博文 类的初始化步骤 . 注意一点,接口字段全部隐式地被修饰为 public, static, final .因此,所有的接口字段实际上都是 static 的,无论有

Java基础——类和对象的初始化过程

本节把类和对象的初始化所涉及到的所有代码块阐述一边. 示例代码: 1 public class Demo { 2 private static String name; 3 private String age; 4 5 // 主函数 6 public static void main(String[] args) { 7 Demo demo = new Demo(); 8 9 } 10 11 // 构造函数 12 public Demo() { 13 System.out.println("我

类的构造及初始化效率对比

基础数据结构: struct A { int a; int b; int c; int d; int e; int f; int g; }; 初始化次数:const int MAX_LOOP_NUM = 100000000; 第一种方式: 无初始化 struct A { A() { } int a; int b; int c; int d; int e; int f; int g; }; for(int index = 0; index < MAX_LOOP_NUM; ++index) { A