C++构造与析构-10

一。对象的初始化

  1.一般所有的对象都需要一个确定的初始状态

  2.解决方案

    a。为每个类偶读提供一个public的initialize函数

    b。对象创建后立即调用initialize函数进行初始化

#include<stdio.h>

class Test
{
    private:
       int i;
    public:
       void initialize()
       {
            i = 0;
        }
        int get1()
        {
            return i;
        }
};

int main()
{
    Test t1;
    Test t2;
    Test t3;

    t1.initialize();
    t2.initialize();
    t3.initialize();

    printf("ti.i = %d\n",t1.get1());
    printf("ti.i = %d\n",t1.get1());
    printf("ti.i = %d\n",t1.get1());

    printf("Press any key to continue");
    getchar();
    return 0;
}

  3.initialize只是一个普通的函数,必须显示的调用

  4.一旦由于失误的原因,对象没有初始化,那么结果将是不确定的

    没有初始化的对象,其内部成员变量的值是不变的。

二。 C++中的构造函数

  1. C++中的类可以定义与类名相同的特殊成员函数。

  2.这种与类名相同的成员函数叫做构造函数

  3.构造函数在定义时可以有参数,但是没有任何返回类型的声明

  4.构造函数的调用

    a。一般情况下C++编译器会自动调用构造函数

    b。一些情况下需要手工调用的函数

#include<stdio.h>

class Test
{
    private:
       int i;
       int j;
       int k;
    public:
        Test(int v)
        {
            i = j = k = v;
        }
        void print()
        {
            printf("i = %d,j = %d,k = %d\n",i,j,k);
        }
};

int main()
{
    Test t1(4);
    Test t2 = 5;
    Test t3 = Test(6);;

    t1.print();
    t2.print();
    t3.print();

    Test tA[3] = {Test(1),Test(2),Test(3)};
    for(int i=0;i<3;i++)
    {
        tA[i].print();
    }

    printf("Press any key to continue");
    getchar();
    return 0;
}

  5.两个特殊的构造函数

#include<stdio.h>
/*  注意:   1.当类中没有定义任何构造函数,C++编译器会提供一个无参构造函数和拷贝构造函数   2.当类中定义了任意的非拷贝构造函数时,C++编译器不会为我们提供无参构造函数*/
class Test
{
    private:
       int i;
       int j;
       int k;
    public:
        Test(const Test& v)
        {
            printf("Test(const Test& v)\n");
        }
        Test()
        {
            printf("Test()\n");
        }

};

int main()
{
    Test t1;
    Test t2 = t1;

    printf("Press any key to continue");
    getchar();
    return 0;
}

  a.无参构造函数

    当类中没有定义构造函数时,编译器默认会提供一个无参构造函数,并且其函数体为空

  b.拷贝构造函数

    当类中没有定义拷贝构造函数时,编译器默认提供一个拷贝构造函数,简单的进行成员变量的值复制

三。数组类

  array.h  

#ifndef _ARRAY_H_
#define _ARRAY_H_

class Array
{
private:
   int mLength;
   int* mSpace;

public:
   Array(int length);
   Array(const Array& obj);
   int length();
   void setData(int index,int value);
   int  getData(int index);
   void destory();
};

#endif

  array.c

#include"array.h"

Array::Array(int length) //数组创建
{
    if(length < 0)
    {
        length = 0;
    }
    mLength = length;
    mSpace = new int[mLength];
}
Array::Array(const Array& obj)
{
    mLength = obj.mLength;
    mSpace = new int[mLength];   

    for(int i=0; i<mLength; i++)
    {
        mSpace[i] = obj.mSpace[i];
    }
}
int Array::length() //数组大小
{
    return mLength;
}

void Array::setData(int index,int value)//设置数组值
{
    mSpace[index] = value;
}

int Array::getData(int index)      //获取数组值
{
    return mSpace[index];
}

void Array::destory()           //销毁空间
{
    mLength = -1;
    delete[] mSpace;
}

  main.c

#include<stdio.h>
#include "array.h"

int main()
{
    Array a1(10);
    for(int i=0; i<a1.length();i++)
    {
        a1.setData(i,i);
    }

    for(int i=0; i<a1.length();i++)
    {
        printf("element %d: %d\n",i,a1.getData(i));
    }

    Array a2 = a1;

    for(int i=0; i<a2.length();i++)
    {
        printf("element1 %d: %d\n",i,a2.getData(i));
    }

    a1.destory();
    a2.destory();

    printf("Press any key to continue");
    getchar();
    return 0;
}

  输出结果

  

时间: 2024-10-20 08:13:10

C++构造与析构-10的相关文章

Python Class __init__ __del__ 构造,析构过程解析【转】

转载自: http://blog.csdn.net/bbdxf/article/details/25774763 最近学习<Python参考手册>即<Learning Python>学到Class部分,遇到了类的构造析构部分的问题: 1.什么时候构造? 2.什么时候析构? 3.成员变量如何处理? 4.Python中的共享成员函数如何访问? ------------------------ 探索过程: 1.经过查找,Python中没有专用的构造和析构函数,但是一般可以在__init_

【C/C++学院】0819-/类的成员函数与const-mutable /构造与析构/拷贝构造deletedefault以及深浅拷贝/静态成员函数成员变量类在内存的存储默认参数/友元类以及友元函数

类的成员函数与const-mutable 成员函数 Fushu.h #pragma once #include <iostream> class fushu { public: int x; int y; public: fushu(); ~fushu(); void show(); inline void showall(int x, int y);//显式内联 void setxy(int x, int y);//编译器优化,默认隐式内联 void show(int x, int y);

NO.8:绝不在构造或者析构过程中调用virtual函数

在构造和析构执行期间不要调用virtual函数,因为这类调用从不会下降至derived class(比起当前执行构造函数和析构函数) 如果在base class 构造函数或者析构函数调用virtual,derived class构造时会先构造base class,则base class中的virtual实际调用是base class的; 第一种解释:derived class类先执行构造base class部分,然而在base class构造过程中,derived class部分是为初始化的,如

C++语言笔记系列之十五——派生类、基类、子对象的构造和析构函数调用关系

例子 example 1 注:若一个基类同时派生出两个派生类,即两个派生类从同一个基类继承,那么系统将为每一个简历副本,每个派生类独立地使用自己的基类副本(比如基类中有属于自己类的静态变量等). #include <iostream.h> class Person { public: person() {cout<<"Construction of person."<<endl;} ~person() {cout<<"Destr

Effective C++_笔记_条款09_绝不在构造和析构过程中调用virtual函数

(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 为方便采用书上的例子,先提出问题,在说解决方案. 1 问题 1: class Transaction{ 2: public: 3: Transaction(); 4: virtual void LogTransaction() const = 0 ; 5: ... 6: }; 7:  8: Transaction::Transaction() //Base cl

Effective C++: 02构造、析构、赋值运算

05:了解C++默默编写并调用哪些函数 1:一个空类,如果你自己没声明,编译器就会为它声明(编译器版本的)一个copy构造函数.一个copy assignment操作符和一个析构函数.此外如果你没有声明任何构造函数,编译器也会为你声明一个default构造函数.所有这些函数都是public且inline的. 2:只有当这些函数被调用时,它们才会被编译器创建出来. 3:编译器创建的析构函数是个non-virtual,除非这个class的base class自身声明有virtual析构函数. 4:以

详谈c++的构造和析构

c++的构造 概念:对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数->由构造函数完成成员的初始化工作 例: 1 #include <iostream> 2 using namespace std; 3 4 class A{ 5 public: 6 A():a(1),b(0){cout<<"A"<<endl;} 7 private: 8 int a; 9 const int b; 10 }; 11 12 int main() 13

iOS开发——swift篇&amp;Swift新特性(四)构造、析构、继承

构造.析构.继承 构造函数 在创建一个类型的实例的时候,构造函数中的参数需要写全参数名: struct Color { let red = 0.0, green = 0.0, blue = 0.0 init(red: Double, green: Double, blue: Double) { self.red = red self.green = green self.blue = blue } } let magenta = Color(red: 1.0, green: 0.0, blue:

45)子类的构造和析构

1) 1 #include<iostream> 2 3 using namespace std; 4 5 class student 6 { 7 public: 8 //student(int a,int b) 9 student() 10 { 11 cout<<"大家好.我是父类的构造函数"<<endl; 12 } 13 private: 14 int a; 15 }; 16 17 18 class ss:public student 19 { 2