C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用)
函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项)
C++类和对象—封装(属性和行为作为整体,设计学生类,访问权限,class和struct的区别,成员属性私有化,设计案例(1立方体类,2点和圆的关系(多文件编程)))
C++类和对象—对象特征(构造函数与析构函数,函数的分类以及调用,拷贝构造函数调用时机,构造函数调用规则,深拷贝和浅拷贝,初始化列表,类对象作为类成员,静态成员)
C++对象模型和this指针(成员变量和成员函数分开存储,this指针的用途,空指针访问成员函数,const修饰成员函数)
C++类和对象-友元(全局函数做友元,友元类,成员函数做友元)
C++ 模板学习01(函数模版)(函数模板的语法、函数模板注意事项、函数模板案例-数组排序、普通函数与函数模板的区别、普通函数与函数模板的调用规则、模板的局限性)
C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)
C++认为万事万物都皆为对象,对象上有其属性和行为
比如说:人可以作为对象,属性有姓名,年龄,身高,体重等等。行为有走,跑,跳,吃饭,唱歌。
车也可以作为对象,属性有轮胎,方向盘,车灯。行为有载人,放音乐,开空调等等。
具有相同性质的对象,我们可以抽象为类,人属于人类,车属于车类。
封装
一.属性和行为作为整体
封装的意义
将属性和行为作为一个整体,表现生活中的事物
将属性和行为加以权限控制
封装意义一:
在设计类的时候,属性和行为写在一起,表现事物
语法:class 类名 { 访问权限 :属性/ 行为} ;
示例1:设计一个圆类,求圆的周长
示例代码:
#include<iostream>
using namespace std;
const double PI = 3.14;
//设计一个圆类,求圆的周长
//圆求周长的公式:2 * PI * 半径
class Circle
{
//访问权限
//公共权限
public:
//属性
int m_r;//半径
//行为
//获取圆的周长
double calculateZC()
{
return 2 * PI * m_r;
}
};
int main()
{
//通过圆类 创建具体的圆(对象)
Circle c1;
//给圆对象 的属性进行赋值
c1.m_r = 10;
cout << "圆的周长为:" << c1.calculateZC() << endl;
}
增加一个设计案例
设计一个学生类型,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号
#include<iostream>
using namespace std;
#include<string>
//设计一个学生类型,属性有姓名和学号,可以给姓名和
//学号赋值,可以显示学生的姓名和学号
class student
{
public:
//属性
string m_name; //姓名
int m_id; //学号
//行为
//显示姓名和学号
void showstudent()
{
cout << "姓名: " << m_name << "学号:" << m_id << endl;
}
};
int main()
{
//创建一个具体的学生 实例化对象
student s1;
//给s1对象 进行属性赋值操作
s1.m_name = "张三";
s1.m_id = 1;
s1.showstudent();
}
但是其中对对象属性赋值还有其他方法,可以在类的行为中写函数进行调用进行赋值(主要不同见主函数中)
#include<iostream>
using namespace std;
#include<string>
//设计一个学生类型,属性有姓名和学号,可以给姓名和
//学号赋值,可以显示学生的姓名和学号
class student
{
public:
//属性
string m_name; //姓名
int m_id; //学号
//行为
//显示姓名和学号
void showstudent()
{
cout << "姓名: " << m_name << "学号:" << m_id << endl;
}
void setname(string name)
{
m_name = name;
}
void setid(int id)
{
m_id = id;
}
};
int main()
{
//创建一个具体的学生 实例化对象
student s1;
//给s1对象 进行属性赋值操作
s1.setname("张三");
s1.setid(1);
s1.showstudent();
}
二.访问权限
类在设计时,可以把属性和行为放在不同的权限下,加以控制
访问权限有三种:
public 公共权限 (类内可以访问 类外可以访问)
protect 保护权限 (类内可以访问 类外不可以访问)
private 私有权限 (类内可以访问 类外不可以访问)
#include<iostream>
using namespace std;
#include<string>
class person
{
//公共权限
public:
string m_name;
//保护权限
protected:
string m_car;
//私有权限
private:
int m_password;
public:
void func()
{
m_name = "张三";
m_car = "梅赛德斯奔驰";
m_password = 100;
}
};
int main()
{
person p;
p.m_name = "lisi";
/*p.m_car = "alscxa";
p.m_password = 1000;*/
}
其中的汽车和密码都是不可以在类外访问的
C++中class和struct的区别
其实唯一的区别就是 默认的访问权限不同
区别:
struct默认权限为公共
class默认权限为私有
三.成员属性私有化
成员属性设置为私有
可以自己控制读写权限
对于写可以检测数据的有效性
#include<iostream>
using namespace std;
#include<string>
class person
{
public:
//设置姓名
void setname(string name)
{
m_name = name;
}
//获取姓名
string getname()
{
return m_name;
}
//获取年龄 (年龄的范围必须是0-150)
int getage()
{
m_age = 18;//初始化年龄
return m_age;
}
//设置情人 只写
void setlover(string lover)
{
m_lover = lover;
}
private:
//姓名 可读可写
string m_name;
//年龄 只读
int m_age;
//情人 只写
string m_lover;
};
int main()
{
person p;
p.setname("张三");
cout << "姓名为:" << p.getname() << endl;
cout << "年龄为:" << p.getage() << endl;
p.setlover("wei");
}
程序设计中对于成员的属性都设置为私有,但是私有在界外无法直接访问,所以这个时候就需要建立公共的成员函数来提供访问的途径
代码中的setname等等都是成员函数以方便来提供可读和可写的特点。
四.设计案例
练习案例1:立方类
设计立方体(cube)
求出立方体的面积和体积
分别用全局函数和成员函数判断两个立方体是否相等
#include<iostream>
using namespace std;
#include<string>
class cube
{
public:
//行为
//设置获取长宽高
void setl(int l)
{
m_l = l;
}
int getl()
{
return m_l;
}
void setw(int w)
{
m_w = w;
}
int getw()
{
return m_w;
}
void seth(int h)
{
m_h = h;
}
int geth()
{
return m_h;
}
//获取立方体面积
int calculateS()
{
return 2 * m_l * m_w + 2 * m_l * m_h + 2 * m_w * m_h;
}
//获取立方体体积
int calculateV()
{
return m_l * m_w * m_h;
}
//利用成员函数判断两个立方体是否相等
bool issamebyclass(cube &c)
{
if (getl() == c.getl() && geth() == c.geth() && getw() == c.getw())
return true;
return false;
}
//属性
private:
int m_l;//长
int m_w;//宽
int m_h;//高
};
//利用全局函数进行判断 两个立方体是否相等
bool issame(cube &c1,cube &c2)
{
if (c1.getl() == c2.getl() && c1.geth() == c2.geth() && c1.getw() == c2.getw())
return true;
return false;
}
int main()
{
cube c1;
c1.seth(10);
c1.setl(10);
c1.setw(10);
cout << "c1的面积是:" << c1.calculateS() << endl;//600
cout << "c1的体积是:" << c1.calculateV() << endl;//1000
cube c2;
c2.seth(10);
c2.setl(10);
c2.setw(10);
//利用全局函数判断
bool ret = issame(c1, c2);
if (ret)
{
cout << "全局函数判断c1=c2" << endl;
}
else
{
cout << "全局函数判断c1!=c2" << endl;
}
//利用成员函数进行判断
ret = c1.issamebyclass(c2);
if (ret)
{
cout << "成员函数进行判断c1=c2" << endl;
}
else
{
cout << "成员函数进行判断c1!=c2" << endl;
}
}
练习案例2:点和圆的关系
设计一个圆形类(circle)和一个点类(point)计算点和圆的关系
点和圆共有三种关系,点在圆内,点在圆上,点在圆外。这些都可以以点与圆心的关系来代表。
而距离可以用公式
与圆的半径进行比较。
#include<iostream>
using namespace std;
#include<string>
//点类
class point
{
public:
void setx(int x)
{
m_x = x;
}
int getx()
{
return m_x;
}
void sety(int y)
{
m_y = y;
}
int gety()
{
return m_y;
}
private:
int m_x;
int m_y;
};
//圆类
class circle
{
public:
//设置半径
void setr(int r)
{
m_r = r;
}
//获取半径
int getr()
{
return m_r;
}
//设置圆心
void setcenter(point center)
{
m_center = center;
}
//获取圆心
point getcenter()
{
return m_center;
}
private:
int m_r;
point m_center;
};
//判断点和圆之间的关系
void issamecircle(circle &c,point p)
{
//计算两点之间的平方
int distance = (c.getcenter().getx() - p.getx()) * (c.getcenter().getx() - p.getx()) +
(c.getcenter().gety() - p.gety()) * (c.getcenter().gety() - p.gety());
//计算半径的平方
int rdistance = c.getr() * c.getr();
//判断关系
if (distance == rdistance)
{
cout << "点在圆上" << endl;
}
else if (distance > rdistance)
{
cout << "点在圆外" << endl;
}
else
{
cout << "点在圆内" << endl;
}
}
int main()
{
circle c;
c.setr(10);
point center;
center.setx(10);
center.sety(0);
c.setcenter(center);
point p;
p.setx(10);
p.sety(10);
issamecircle(c, p);
}
在上面代码中可以知道在类中可以让另一个类,作为本来中的成员。
点类和圆类可以使用分文件编程的方法来编写
增加两个头文件circle.h point.h
circle:
#include<iostream>
#pragma once
using namespace std;
#include"point.h"
//圆类
class circle
{
public:
//设置半径
void setr(int r);
//获取半径
int getr();
//设置圆心
void setcenter(point center);
//获取圆心
point getcenter();
private:
int m_r;
point m_center;
};
point:
#pragma once
#include<iostream>
using namespace std;
class point
{
public:
void setx(int x);
int getx();
void sety(int y);
int gety();
private:
int m_x;
int m_y;
};
其中#pragma once是为了避免多次引用头文件,在头文件中函数只需声明即可
函数的具体实现可以写在源代码中
源代码增加两个circle.cpp point.cpp
circle.cpp:
#include"circle.h"
//圆类
//设置半径
void circle::setr(int r)
{
m_r = r;
}
//获取半径
int circle::getr()
{
return m_r;
}
//设置圆心
void circle::setcenter(point center)
{
m_center = center;
}
//获取圆心
point circle::getcenter()
{
return m_center;
}
point.cpp:
#include"point.h"
void point::setx(int x)
{
m_x = x;
}
int point::getx()
{
return m_x;
}
void point::sety(int y)
{
m_y = y;
}
int point::gety()
{
return m_y;
}
注意函数在使用的时候要声明其是成员函数
主函数的源代码:
#include<iostream>
using namespace std;
#include<string>
#include"circle.h"
#include"point.h"
//判断点和圆之间的关系
void issamecircle(circle &c,point p)
{
//计算两点之间的平方
int distance = (c.getcenter().getx() - p.getx()) * (c.getcenter().getx() - p.getx()) +
(c.getcenter().gety() - p.gety()) * (c.getcenter().gety() - p.gety());
//计算半径的平方
int rdistance = c.getr() * c.getr();
//判断关系
if (distance == rdistance)
{
cout << "点在圆上" << endl;
}
else if (distance > rdistance)
{
cout << "点在圆外" << endl;
}
else
{
cout << "点在圆内" << endl;
}
}
int main()
{
circle c;
c.setr(10);
point center;
center.setx(10);
center.sety(0);
c.setcenter(center);
point p;
p.setx(10);
p.sety(10);
issamecircle(c, p);
}
在使用分文件编写的时候只需要进行引用即可。