垂直网站建设的关键因素,怎么做一个网站出来,网站制作商业模式,网站如何备案流程基本概念#xff1a;
类-类型#xff1b;类描述抽象概念的#xff1b;
对象-变量#xff1b;对象描述客观实的#xff1b;
在进行面向对象程序设计时要先声明类#xff0c;再创建该类的对象。
为了方便讲述与理解这里我使用一个例题进行讲解吧。
例子#…基本概念
类-类型类描述抽象概念的
对象-变量对象描述客观实的
在进行面向对象程序设计时要先声明类再创建该类的对象。
为了方便讲述与理解这里我使用一个例题进行讲解吧。
例子一个完整的类与对象的题目
求圆柱体的表面积与体积
#include iostream
#include cmath
using namespace std;class Point
{
public:Point(double aa 0, double bb 0){a aa;b bb;p 3.14*pow(a,2);c 3.14 * 2*a;}double getVolume(){return p * b;}double getArea(){return 2*pc*b;}
private:double a;double b;double c;double p;
};
int main()
{double x,y;cin xy;Point t1(x,y);cout t1.getArea() t1.getVolume();return 0;
}
主函数中
Point t1(x,y); 表示建立一个对象
Point表示的是类名必须是已经存在的类名才行
t1表示对象名自己起起名规则与标识符相同
而xy实参具体的一会再说
t1.getArea()表示使用t1的getArea
如何定义类
定义类时要将类的位置放到函数的上面要不然程序跑到主函数时找不到类
class为关键词管理类中默认权限。这里还有一个关键词为struct这两个区别就是class默认权限是private,而struct默认为pubilc;
那么什么是权限呢
class 类名
{
public: 公有数据成员 公有成员函数
protected: 保护数据成员 保护成员函数
private: 私有数据成员 私有成员函数
};
权限分为三种pubilc、protected、private
pubilc:共有权限,不管是类内还是类外都可以访问到
protected保护权限类内与派生类可以访问到
private私有权限只有类内可以访问到
C提供了比结构体类型更加方便安全的类类型类的定义一般分为说明部分和实现部分。
说明部分来说明该类中的成员数据成员和成员函数成员函数是对数据成员进行操作的
实现部分对成员函数进行定义。
Point为类名可随意定义一般首字母要大写
{}定义类与定义函数的区别是要在“}”后面加上一个“”
数据成员
1.定义数据成员时不能给数据成员赋初值。因为类是抽象的只是一种类型类中 的数据成员不占内存空间。
class Point
{
double z;
double a;
double x10;//错误
double y20;//错误
};2.类的数据成员可以使用 C基本数据类型、构造数据类型还可以使用已定义完整的类类型。
class Point
{
double x;
double y;
};class Circle
{
Point p;//定义了上面的point中的成员
double r;
};
3.在正在定义的类中因为该类还没有定义完整所以不能定义该类类型的数据成员只能定义该类类型的指针或引用成员。
class Point
{
double x;
double y;
Point p1;//错误
Point p2;//正确
Point *p3;//正确
};那么定义了数据成员不能赋值该如何使用呢
成员函数
成员函数的定义、声明格式与非成员函数(全局函数)的格式与用法基本一样只是成员函数属于某 个类。成员函数的定义可以放在类中也可以放在类外。
内联函数
所有在类内部定义的函数都是内联函数称为隐式定义。
内联函数在编译时使用函数体替换调用处的函数名可以提高函数运行的速度但是会增加编译的时间。
class Point
{
public:
返回值类型 函数名(形参)
{函数的内容
}
void SetPoint(double xx,double yy)
{
xxx;
yyy;
}
void Display()
{
cout(x,y)endl;
}
private:
double x;
double y;
};在主函数或者自定义函数里时使用某对象的Setpoint需要(实际函数)而Display()不用
在类外定义函数体的格式如下
返回值类型 类名::成员函数名(形参表)
{函数体
}::是类的作用域分辨符放在类名与成员函数之间表明后面的成员函数属于前面的那个类。
但在类外定义时需要在函数定义的 头前加上关键字 inline称为显示定义这样做使代码书写更加清晰。
如果采用这种方式定义内联函数类的声明和内联成员函数的定义要放在同一个文件中否则在编译时无法进行代码置换。
例如与上面的内联函数效果一样的例子
class Point
{
public:void SetPoint(double xx,double yy);void Display();
private:double x;double y;
};inline void Point::SetPoint(double xx,double yy)
{xxx;yyy;
}inline void Point::Display()
{
cout(x,y)endl;
}一般地按照习惯将成员放入private函数放入public;
你一定发现了怎么有个函数没有返回值呢这是一个特殊的函数--构造函数
构造函数
构造函数是一种特殊的成员函数函数名与类名相同可以有任意类型的参数但不能有返回值类型在建立对象时自动调用用于为对象分配空间并进行初始化。
这就是在最上面的例子中我的主函数中建立Point t1(x,y)时可以加x,y的原因.如何没有定义构造函数不可加上(x,y)这样的实参就是要写成这样Point t1
如果在定义类时没有为类定义构造函数编译系统就生成一个默认形式的隐含的构造函数这个构造函数的函数体是空的因此默认构造函数只为对象开辟空间而不对数据成员赋初值。
这是有人发现了为什么我的构造函数中里的形参要加上 0 这一步呢
又是一个例子
#include iostream
using namespace std;
class Point
{public:Point(double xx0, double yy0){x xx;y yy;}void setPoint(double xx, double yy){xxx;yyy;}void displayPoint(){cout ( x ,y ) endl;}private:double x;double y;
};int main()
{double x,y;cinxy;Point p;p.displayPoint();p.setPoint(x,y);p.displayPoint();return 0;}
这里在建立对象时没有给进实参所以构造函数就会调用形参中的赋值进入形参里面
如果不写0系统会报错为啥呢因为在建立一个对象后我又使用了一个类里的函数这个函数的功能是输出数据成员而这时数据成员没有值数据成员为抽象的没有值就会报错所以输出不了就无法使用这个函数
那么我可不可以这样定义呢 Point(double xx, double yy){xx0;yy0;x xx;y yy;}
当然不行了因为数据成员时不能给数据成员赋初值
又又人发现了你最上面的例子不对啊为啥构造函数里的形参0和实参都写了。这样写是不算错的实参有数据成员函数的形参会忽略掉形参里的赋值效果等于没有形参的0
这时又又又注意到了为什么成员函数的形参不像自定义函数里的形参似的可以设置成与实参一样的变量呢
哈哈又是一个例子
#include iostream
using namespace std;
class Point
{public:Point(double x, double y){x x;y y;}void displayPoint(){cout x y endl;}private:double x;double y;
};int main()
{double x,y;cinxy;Point p(x,y);p.displayPoint();return 0;}如果设成这样会报错吧当然不会啦但是当你跑起程序时你会发现输出的值不是你想要的而是一堆乱码。为啥呢因为我们编译器搞不明白xx是哪两变量是新参还是数据函数就会造成程序错误。那怎么解决呢
this指针
this 指针是一个系统预定义的特殊指针指向当前对象只能在类的成员函数中使用 存有当前对象的地址程序员不能改变只能使用。
成员函数的形参名与数据成员名相同时访问数据成员需要在数据成员前用 this 指针
Point(double x,double y)
{
this-xx;
this-yy;
}这样编译器就会明白了第一个x是数据成员第二个x是形参中的x 类与对象的例题 参考资料
[1]CSDNC class 和 struct 构造函数
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]