Wblog

岁月蹉跎

类与对象

构造函数

  1. what
    作用:
  • 顾名思义,作用已在名称中显现出【构造】。构造什么呢?对象完成一个行为,显然要调用成员函数,那实例化对象这个行为,调用的正是此函数。构造对象。
  • 如果写了参数,那就可以在实例化的同时完成初始化。
  1. how
    形式:
  • 返回值类型:没有返还值,但不用void
  • 函数名:与类名同名
  • 参数列表:可写参且可具有缺省值
    • 写参数主要就是写形参的类型,以供编译器检查传来的实参是否合法。
    • 如果具有缺省值,仅在声明时添加,定义时不添加缺省值
  • 函数体:对成员数据赋值
    • 在声明时,不用加花括号
  • return 语句
    • 鉴于本人学习过程中经常忘记写,单拎出来!
  1. 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. 函数的声明写在类体内,定义写在类体外
  2. 保留跟声明同样的格式,加上类名即可
  3. 参数列表里名不能再带有缺省值
返回值类型 类名::函数成员名(参数表)
{
    函数体;
}

复制(拷贝)构造函数

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;
}

posted on 2023-04-14 17:42  岁月蹉跎  阅读(27)  评论(0编辑  收藏  举报

导航