类与对象
构造函数
- what
作用:
- 顾名思义,作用已在名称中显现出【构造】。构造什么呢?对象完成一个行为,显然要调用成员函数,那实例化对象这个行为,调用的正是此函数。构造对象。
- 如果写了参数,那就可以在实例化的同时完成初始化。
- how
形式:
- 返回值类型:没有返还值,但不用void
- 函数名:与类名同名
- 参数列表:可写参且可具有缺省值
- 写参数主要就是写形参的类型,以供编译器检查传来的实参是否合法。
- 如果具有缺省值,仅在声明时添加,定义时不添加缺省值
- 函数体:对成员数据赋值
- 在声明时,不用加花括号
- return 语句
- 鉴于本人学习过程中经常忘记写,单拎出来!
- why
#include <iostream>
using namespace std;
class Dog
{
public:
//定义一个含参且具有缺省值的构造函数.***不用带花括号。缺省值仅在声明时写,定义时不在写
Dog(int newAge=0,double newWeight=0);
int GetAge();
double GetWeight();
void SetAge(int newAge);
void SetWeight(double newWeight);
void Show();
//成员数据的抽象
private:
int age;
double weight;
};
//成员函数的实现,定义在类体之外,而且要带上类名,这里只有一个类,如果有多个类,就要区别是那个类的成员函数定义,通过写名字的方法。
int Dog::GetAge()
{
return age;
}
double Dog::GetWeight()
{
return weight;
}
void Dog::SetAge(int newAge)
{
age = newAge;
}
void Dog::SetWeight(double newWeight)
{
weight = newWeight;
}
void Dog::Show()
{
cout<<"age="<<age<<"weight="<<weight<<endl;
}
//构造函数的定义
Dog::Dog(int newAge,double newWeight)
{
age = newAge;
weight = newWeight;
}
int main(int argc, char** argv) {
Dog dog1(12,34.0);
dog1.Show();
dog1.SetAge(56);
dog1.SetWeight(78.0);
dog1.GetAge();
dog1.GetWeight();
dog1.Show();
return 0;
}
类的成员函数的实现
- 函数的声明写在类体内,定义写在类体外
- 保留跟声明同样的格式,加上类名即可
- 参数列表里名不能再带有缺省值
返回值类型 类名::函数成员名(参数表)
{
函数体;
}
复制(拷贝)构造函数
1.what
作用:
- 复制本类对象,去初始化一个新对象
- 新的对象具有被拷贝的对象的全部数据成员
2.how
形式:
- 返回值:不写
- 函数名:与类同名
- 参数列表:
- 类名 本类对象的引用【类名 &本类的对象】
- 函数体
- 数据成员1 = 本类对象.数据成员1;
#include <iostream>
using namespace std;
class Point
{
public:
Point(double nx = 0,double ny = 0);
Point(const Point &p);
void SetX(double nx);
void SetY(double ny);
double GetX();
double GetY();
double MoveX(double nx);
double MoveY(double ny);
void Print();
private:
double x,y;
};
Point::Point(double nx,double ny):x(nx),y(ny)
{}
Point::Point(const Point &p):x(p.x),y(p.y)
{}
void Point::SetX(double nx)
{
x = nx;
}
void Point::SetY(double ny)
{
y = ny;
}
double Point::GetX()
{
return x;
}
double Point::GetY()
{
return y;
}
double Point::MoveX(double nx)
{
return x = nx;
}
double Point::MoveY(double ny)
{
return y = ny;
}
void Point::Print()
{
cout<<"x="<<x<<"y="<<y<<endl;
}
int main()
{
Point p(1,2);
cout<<"初始化的";
p.Print();
p.SetX(3);
p.SetY(4);
cout<<"修改后的x="<<p.GetX()<<"y="<<p.GetY()<<endl;
p.MoveX(1);
p.MoveY(2);
cout<<"移动后的";
p.Print();
Point a(p);
cout<<"a拷贝p的数据成员为";
a.Print();
return 0;
}