构造函数:与类名同、无返回可有参数
class Test
{
private:
int i,j,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();
}
return 0;
}
类成员函数和普通函数一样可进行重载,并遵守相同重载规则
类中没定义任何一构造函数,编译器默认提供无参构造函数(函数体为空)和拷贝构造函数(简单的进行成员变量的复制)
类中仅定义非拷贝构造函数,编译器不再提供无参构造函数,但提供拷贝构造函数
类中仅定义拷贝构造函数,编译器不再提供无参构造函数
Test(const Test& obj) {}//拷贝构造函数
Test t1; Test t2(t1);
例:
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,t2;
t1.print();
t2.print();
Test t3(t1); //拷贝构造函数被调用
t3.print();
return 0;
}
------/例:数组类的创建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.cpp
#include "Array.h"
Array::Array(int length)
{
if( length < 0 )
{
length = 0;
}
mLength = length;
mSpace = new int[mLength];
}
//不能使用默认拷贝构造函数,否则使a1.mSpace与a2.mSpace内容同,指向同一内存
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.cpp
#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("Element %d: %d\n", i, a2.getData(i));
}
a1.destory();
a2.destory();
return 0;
}