问题背景:
在读新的程序的时候,遇到未定义的标识符Point,自己也不清楚这个到底是内置的常规变量,引入常规的头文件也无法解决,上网搜索未定义的标识符Point也没有给出答案,我就想到了这个是不是自己定义的类函数,所以应该需要在程序中加入这个类函数的定义段才能正常运行。
问题:
由于我没有学过C++,不太懂类函数如何定义,所以搜索学习了下类函数的定义,自己梳理一下,也顺便分享给大家,在自己的理解下自圆其说,如果有理解表述不对的地方,还希望各位多多指教。
问题解剖:
一、类函数作用
声明变量但不定义变量
函数的声明和定义_Persistence_Y_1的博客-优快云博客_函数的声明
声明:说明函数的名字,参数,返回类型;
定义:说明函数的具体实现方式,交代清楚函数的功能。
二、类函数的组成
首先需要清楚定义一个类函数,里面主体包含的几部分
class Point
{
public:
Point(double x=0, double y=0);
void Set(double x, double y);
void LeftMove(double dx);
void UpMove(double dy);
void Display();
private:
double m_x;
double m_y;
};
类函数中包含
1、public:
指的是共有变量,任何外部函数都可以访问共有类型数据和函数。
2、private:
指的是私有变量,只允许本类中的函数访问,而类外部的任何函数都不能访问。
我的理解是共有变量相当于说明一下各成员函数的输入变量,这些输入变量大多可能会与私有变量进行关联,相当于对这一类函数对私有变量进行不同操作后返回结果,所以私有变量就类似函数的返回值。
具体成员函数实现的功能是在类函数的声明后去定义的。
3、protected:
与private相似,其差别表现在继承与派生时对派生类的影响不同。
三、类函数如何声明?
声明函数的名称,参数,返回类型
Point(double x=0, double y=0); //double是定义这个参数变量,=0是给其赋值。
// 构造函数的实现:(不能规定返回类型return)
void Set(double x, double y); //void代表空,说明此函数执行完不返回任何值
四、具体成员函数的定义
构造函数
//三种构造函数的方式
Point::Point(double x, double y) //第一个Point代表类函数的名称,带二个point代表成员函数-构造函数的名称 ::起到调用的作用
//Point用于实现对函数的数据成员x,y进行初始化
//double x与double y是这个成员函数的输入变量
{
m_x = x; //输入变量与私有变量产生关联
m_y = y;
}
Point::Point(double x, double y): //初始化列表
m_x(x),m_y(y) {}
Point::Point(double x, double y):m_x(0),m_y(0) {} //默认构造函数
::在C++中是什么意思 - 百度文库 (baidu.com)
C++类的定义_Sermiscry的博客-优快云博客_c++ 定义类
在对象被创建时使用特定的值构造对象,或者将对象初始化为一个特定的初始状态
- 函数名与类名相同
- 不能定义返回值类型,也不能有return语句,但也不能用void
- 不能人为调用,只能系统调用
- 可以有形式参数,也可以没有形式参数
- 可以重载
- 可以带默认参数值
默认构造函数(调用时可以不需要实参的构造函数)
-
参数表为空的构造函数
-
全部参数都有默认值的构造函数
-
构造函数调用顺序:先调用内嵌对象的构造函数(按内嵌时的声明顺序,先声明者先构造)。然后调用本类的构造函数。
五、类函数的调用
int main()
{
double x1, y1, x2, y2, dx, dy; //在主函数中定义需要用到一些的双精度变量
cin >> x1 >> y1; //cin代表键盘键入对变量赋值,>>代表需要空格分隔输入变量
cin >> dx;
cin >> dy;
cin >> x2 >> y2;
Point p1; //调用Point类函数,函数名称为为p1,一开始没有对p1输入变量进行初值化,但函数初值为零,将其赋值给m_x,m_y
p1.Display(); //输出
p1.Set(x1, y1); //set函数的输入变量是x1,x2,作用是起到对p1初值化的私有参数重新赋值
p1.Display();
p1.LeftMove(dx); //leftMove起到对p1私有参数中的x内容进行减值的操作,减值的大小为输入变量dx
p1.Display();
p1.UpMove(dy); //UpMove起到给p1私有参数中的y内容增值的操作,增值的大小为输入变量dy
p1.Display();
Point p2(x2, y2); //调用Point类函数,函数名称为为p2,对p2进行初值化,其中的x赋值x2,y赋值y2,再将其赋值给其m_x,m_y
// p1和p2虽然都调用了Point类函数,但他们属于不同的函数(函数p1和函p2),进行了不同的初值化,不公用私有变量
p2.Display();
return 0;
}
实例
类与对象练习题(一)---Point类_Lucky_追梦仔的博客-优快云博客
定义一个Point类,数据成员包括私有数据成员为double类型的点坐标x,y;成员函数包括构造函数Point(用于实现对数据成员x,y的初始化)、成员函数Set(用于改变数据成员x、y的值)、成员函数LeftMove(点坐标向左移动detax)、成员函数上移UpMove(点坐标上移detay)、成员函数Display(用于输出点坐标x、y,输出格式为点坐标用逗号分隔并半角圆括号括起来)
程序:
#include<iostream>
using namespace std;
class Point
{
public:
Point(double x=0, double y=0);
void Set(double x, double y);
void LeftMove(double dx);
void UpMove(double dy);
void Display();
private:
double m_x;
double m_y;
};
Point::Point(double x, double y)
{
m_x = x;
m_y = y;
}
void Point::Set(double x, double y)
{
m_x = x;
m_y = y;
}
void Point::LeftMove(double dx)
{
m_x = m_x - dx;
}
void Point::UpMove(double dy)
{
m_y = m_y + dy;
}
void Point::Display()
{
cout << "(" << m_x << "," << m_y << ")" << endl;
}
int main()
{
double x1, y1, x2, y2, dx, dy;
cin >> x1 >> y1;
cin >> dx;
cin >> dy;
cin >> x2 >> y2;
Point p1;
p1.Display();
p1.Set(x1, y1);
p1.Display();
p1.LeftMove(dx);
p1.Display();
p1.UpMove(dy);
p1.Display();
Point p2(x2, y2);
p2.Display();
return 0;
}
输出结果:
1
2
3
4
5
6
(0,0)
(1,2)
(-2,2)
(-2,6)
(5,6)
D:\Software\VSfile\canny\x64\Debug\canny.exe (进程 30684)已退出,代码为 0。
按任意键关闭此窗口. . .
好啦,就这么多了,如果我的博文有帮到你,请点赞给我加油呀,也谢谢在解决问题过程中参考的诸位大佬们啦~