讲在前面
本小结有析构函数、C++函数后面接:的含义 、C++中public、protected及private用法、条件运算符、fabs()和abs()区别、C++中的结构体内的函数、类中成员函数声明后面接 const、C++中函数定义前加virtual关键字的作用。
析构函数
析构函数主要作用就是释放资源,避免内存泄漏。析构函数与构造函数对应,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统会自动执行析构函数。析构函数名也应与类名相同,只是在函数名前面加一个位取反符 ~,例如 ~stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。
如果一个类中有指针,且在使用的过程中动态的申请了内存,那么最好显示构造析构函数在销毁类之前,释放掉申请的内存空间,避免内存泄漏。
按照 C++ 的要求,只要有 new 就要有相应的 delete 。这专个 new 是在构造函数里 new 的,就是出生的时候。所以在死掉的时候,就是调用析构函数时,我们必须对指针进行 delete 操作。
array new 一定要搭配 array delete ,即delete[]
C++函数后面接:的含义
c++成员函数后面跟“:”表示的是赋值,这是c++的特性
还有就是:构造函数中第二种初始化语法–成员初始化列表
A( int aa, int bb ):a(aa),b(bb)
{
}
//相当于
A( int aa, int bb )
{
a=aa;
b=bb;
}
构造函数后加冒号是初始化表达式:
有四种情况下应该使用初始化表达式来初始化成员:
1:初始化const成员
2:初始化引用成员
3:当调用基类的构造函数,而它拥有一组参数时
4:当调用成员类的构造函数,而它拥有一组参数时。
冒号初始化是给数据成员分配内存空间时就进行初始化,就是说分配一个数据成员只要冒号后有此数据成员的赋值表达式(此表达式必须是括号赋值表达式),那么分配了内存空间后在进入函数体之前给数据成员赋值,就是说初始化这个数据成员此时函数体还未执行。 对于在函数中初始化,是在所有的数据成员被分配内存空间后才进行的。
student ::student (int i,int j)
{
a=i;
b=j;
}
student ::student(int i,int j):a(i),b(j)
{
}
ConvexMPCLocomotion::ConvexMPCLocomotion() :
horizonLength(10),//函数名后加冒号,相当于开了一个内存赋值的作用
trotting(horizonLength, Vec4<int>(0,5,5,0), Vec4<int>(5,5,5,5),"Trotting"), //这里是赋值
bounding(horizonLength, Vec4<int>(5,5,0,0),Vec4<int>(5,5,5,5),"Bounding"),
pronking(horizonLength, Vec4<int>(0,0,0,0),Vec4<int>(4,4,4,4),"Pronking"),
galloping(horizonLength, Vec4<int>(0,2,7,9),Vec4<int>(6,6,6,6),"Galloping"),
standing(horizonLength, Vec4<int>(0,0,0,0),Vec4<int>(10,10,10,10),"Standing"),
trotRunning(horizonLength, Vec4<int>(0,5,5,0),Vec4<int>(3,3,3,3),"Trot Running"),
walking(horizonLength, Vec4<int>(0,3,5,8), Vec4<int>(5,5,5,5), "Walking"),
walking2(horizonLength, Vec4<int>(0,5,5,0), Vec4<int>(7,7,7,7), "Walking2"),
pacing(horizonLength, Vec4<int>(5,0,5,0),Vec4<int>(5,5,5,5),"Pacing")
{
dtMPC = 0.001 * iterationsBetweenMPC; //头文件中定义了
setup_problem(dtMPC, horizonLength, 0.4, 120); //设置参数
rpy_comp[0] = 0;
rpy_comp[1] = 0;
rpy_comp[2] = 0;
rpy_int[0] = 0;
rpy_int[1] = 0;
rpy_int[2] = 0;
for(int i = 0; i < 4; i++)
firstSwing[i] = true; // 赋值 正确,布尔量来的
}
C++中public、protected及private用法
1.类的一个特征就是封装,public和private作用就是实现这一目的。所以:
用户代码(类外)可以访问public成员而不能访问private成员;private成员只能由类成员(类内)和友元访问。
2.类的另一个特征就是继承,protected的作用就是实现这一目的。所以:protected成员可以被派生类对象访问,不能被用户代码(类外)访问。
public, protected, private三种继承方式,它们相应地改变了基类成员的访问属性
public继承: 基类public成员,protected成员,private成员的访问属性在派生类中分别变成: public, protected, private (属性还是保持不变)
protected继承: 基类public成员,protected成员,private成员的访问属性在派生类中分别变成:protected, protected, private (公有变为保护变量)
private继承: 基类public成员,protected成员,private成员的访问属性在派生类中分别变成:private, private, private (全部变为私有属性的了)
但无论哪种继承方式,上面两点都没有改变:
private成员只能被本类成员(类内)和友元访问,不能被派生类访问;
protected成员可以被派生类访问。
继承类就是别继承类的派生类
条件运算符:
<表达式1>?<表达式2>:<表达式3> ;
含义是: 先求表达式1的值,如果为真,则执行表达式2,并返回道表达式2的结果 ; 如果表达式1的值为假,则执行表达式3 ,并返回表达式3的结果
fabs()和abs()区别
函数名: abs
功 能: 求整数的绝对值
用 法:
int abs(int i);
返回的是|x|的值
函数名:fabs
功能:求浮点数x的绝对值
用法:
float fabs(float j);
double fabs(double j);
返回的是|x|的值
C++中的结构体内的函数
在C++中除了类中可以有构造函数和析构函数外,结构体中也可以包含构造函数和析构函数,这是因为结构体和类基本雷同,唯一区别是,类中成员变量默认为私有,而结构体中则为公有。注意,C++中的结构体是可以有析构函数和构造函数,而C则不允许。
类中成员函数声明后面接 const
const 表示对类中成员函数属性的声明;
表示不会修改类中的数据成员;
在编写const成员函数时,若不慎修改了数据成员,或者调用了其他非const成员函数,编译器将指出错误;
C++中函数定义前加virtual关键字的作用
加了Virtual关键字的函数就是虚拟函数,而=0的意思表示本类不对这个成员函数进行实现,即该成员函数没有函数体,这种函数叫纯虚函数。
class CShape
{
public:
virtual void Show()=0;
};
虚指针,虚函数表等知识。。。。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)