C++小结 析构函数、函数后面接冒号 等等

讲在前面

本小结有析构函数、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;
};

虚指针,虚函数表等知识。。。。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值