1、对象的初始化
一般而言,所有的对象都需要一个确定的初始化状态,而在C++中,在定义类对象的时候不能对成员变量进行初始化,以此则推导出这样一个解决办法:首相为每个类都提供一个public的initialize函数,对象创建后立即调用initialize函数进行初始化。
class Test
{
pricate:
int i;
public:
void initialize()
{
i = 0;
}
int getI()
{
return i;
}
};
int main()
{
Test t1;
Test t2;
Test t2;
t1.initialize();
t2.initialize();
t3.initizlize();
}
然而initialize只是一个普通的函数,必须显示的调用,一旦由于失误的原因,队形没有初始化,那么结果将是不确定的,没有初始化的对象,其内部程艳变量的值时不定的。这才引出了C++中的构造函数
2、C++中的构造函数
C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数,构造函数在定义时可以有参数,但是没有任何返回类型的声明。
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);
}
}
一般情况下C++编译器会自动调用构造函数,在一些情况下则需要手工调用构造函数。
#include
#include
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(3),Test(4),Test(5)};//主动调用构造函数
for(int i = 0; i < 3; i++)
{
tA[i].print();
}
printf("Press any key to continue...\n");
getchar();
return 0;
}
;类的成员函数和普通函数一样可以进行重载,并遵守相同的重载规则。
两个特殊的构造函数
#include
#include
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...\n");
getchar();
return 0;
}
无参构造函数:
当类中没有定义构造函数时,编译器默认提供一个无参构造函数 ,并且其函数体为空。
拷贝构造函数:
当类中没有定义拷贝构造函数时,编译器默认提供一个拷贝构造函数,简单的进行成员变量的值复制。
注意:
1. 当类中没有定义任何一个构造函数,C++编译器会为提供无参构造函数和拷贝构造函数
2. 当类中定义了任意的非拷贝构造函数时,C++编译器不会为提供无参构造函数
-
#include <stdio.h>
-
class Test
-
{
-
private:
-
int i;
-
int j;
-
int k;
-
public:
-
void print()
-
{
-
printf("i = %d, j = %d, k = %d\n", i, j, k);
-
}
-
};
-
int main()
-
{
-
Test t1;
-
Test t2 = t1;
-
t1.print();
-
t2.print();
-
printf("Press any key to continue...");
-
getchar();
-
return 0;
-
}
-
3、创建数组类
-
#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
-
#include "Array.h"
-
Array::Array(int length)
-
{
-
if( length < 0 )
-
{
-
mLength = 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;
-
}
-
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include "Array.h"
-
int main()
-
{
-
Array a1(10);
-
for(int i = 0; i < 10; i++)
-
{
-
a1.setData(i,i);
-
}
-
for(int i = 0; i < 10; i++)
-
{
-
printf("Element: %d\n",a1.getData(i));
-
}
-
Array a2 = a1;
-
for(int i = 0; i < 10; i++)
-
{
-
printf("Element: %d\n",a2.getData(i));
-
}
-
a1.destory();
-
a2.destory();
-
printf("Press any key to continue...\n");
-
getchar();
-
return 0;
-
}
阅读(2775) | 评论(0) | 转发(1) |