类
1. 成员的种类
class 类名称{
private:
私有成员; // 只能被成员函数所引用(不能被对象引用)。默认情况下都是私有的(缺省设置)。
protected:
保护成员; // 除了可被成员函数所引用外,还可被派生类引用。(半封闭性)
public:
公有成员; // 可以被任何成员引用.
};
注:
- 成员数据:大部分都会列为私有成员,因为类数据必须有封装的效果,使数据具有一致性不可以随便让成员函数以外的函数来引用;
- 成员函数:大部分都会定义为公有成员,因为这是类以外的函数可以操作该对象的公共接口。
- 类中的数据成员的数据类型可以是任意的,但不允许对所定义的数据成员进行初始化。
class person{
private:
int age=18; // 错误
}
2. 构造函数(Constructor)
- 定义:类的定义中不能对数据成员进行初始化,为了给数据成员自动设置某些初始值,就要使用类的特殊成员函数-------构造函数。
- 特点:
- 与类同名;不具有返回类型;
- 公有函数,但它不能象其他成员函数被显示地调用,构造函数可以被重载。
- 定义对象时,编译系统会自动调用构造函数;
- 利用构造函数,创建对象的方法:
a. 直接初始化;
Ccomplex A(1.2,3.4);
cout<<A.abscomplex();
b. 通过指针和new来实现;
Ccomplex *A=new Ccomplex(1.2,3.4);
cout<<A->abscomplex();
- 说明:
- 如果没有给类定义构造函数,则编译系统自动地生成一个默认的构造函数。例如:Ccomplex :: Ccomplex(){};
- 构造函数可采用初始化表对数据进行初始化;
- 对没有定义构造函数的类,其公有数据成员可以用初始表进行初始化;
- 初始化数据不一定只能用构造函数;
class Ccomplex{
public:
char name[10];
double imag;
};
void main(int argc, char* argv[])
{
Ccomplex A={"wang",21};
cout<<A.name ;
}
- 重载构造函数!!!!
- 代码
#include <iostream>
using namespace std;
// 类
class family{
private:
int age1;
int age2;
double weight1;
double weight2;
public:
family(int x,int y) // 析构函数:公有函数;与类同名;不具有返回类型;
{age1=x;age2=y;}
// 等价于:family(int x, int y):age1(x);age2(y){}
family(double m,double n)
{weight1=m;weight2=n;}
int sum();
};
// 函数成员
int family::sum()
{return age1+age2;} // 外部:显示定义
int main()
{
// 用法一,构造函数创建对象:方法一,直接初始化
family A(10,20); // 定义对象时,调用构造函数
cout << A.sum() << endl; // 30
// 用法一,构造函数创建对象:方法二,通过指针和new来实现
family *B=new family(35,55);
cout << B->sum() << endl;
// 构造函数的重载
family C(10.0,20.0);
return 0;
}
3. 拷贝构造函数(copy constructor)
- 定义:
- 拷贝构造函数是一种特殊的构造函数.它用于依据已存在的对象,建立一个新的对象;
- 特点:
- 因为该函数也是一种构造函数,所以其函数名与类名相同,并且该函数也没有返回类型;
- 该函数只有一个参数,并且是同类对象的引用;
- 每个类都必须有一个构造函数.如果程序员没有定义类的拷贝构造函数,系统就会自动生成一个默认的拷贝构造函数,用于复制出数据成员值完全相同的新对象;
- 同类型的对象之间也可以进行赋值;
- 自定义拷贝函数:
- 在程序中,用一个对象去初始化另一个对象,或者说,用一个对象去复制另一个对象,可以有选择、有变化的复制。
- 方法:
- “代入”法:point p2(p1);
- “赋值”法:point p2=p1;
- 综合代码:
#include <iostream>
using namespace std;
// 功能:拷贝构造函数;
class person{
int x,y;
public:
person(int a,int b)
{x=a;y=b;}
person(const person &p)
{x=2*p.x;y=2*p.y;}
void print()
{cout << "x:" << x << " y:" << y <<endl;}
};
int main(int argc,char* argv[])
{
person A1(10,20);
A1.print();//10,20;
person A2(A1); // 用法一,调用自定义拷贝,方法一:“代入”法;
A2.print();//20,40;
person A3=A1; // 用法一,调用自定义拷贝,方法二:“赋值”法;
A3.print();//20,40;
// 用法二,同类型的对象之间可以赋值;
person B1(30,40);
person B2(50,60);
B2=B1;
B2.print();//30.40;
return 0;
}