C++11回顾学习(1): 语法简要回顾和通俗解释
RobotSlamApplication: C++语法简要回顾和通俗解释
背景介绍: 最近在从头到尾写一个vSLAM的小型系统,已经写了大半,完成VO和Mapping的编写,现在在努力学习和编写回环检测和后端优化部分,这些都是编写代码中遇到的问题,现在先列出来记录一下。
一. 函数重载
- C++允许多个函数拥有相同的名字,只要参数列表不同就可以,这就是函数重载.
- 参数列表: 包括参数的类型、参数的个数和参数的顺序,只要一个不同就是不同.
二. 内联函数
- 前提: 函数的调用是有时间和空间开销.
- 为了减少开销,将"短小"的函数体声明为内联函数,并在函数定义处添加inline关键字.
- 在函数的声明处添加inline关键字无效.
三. 类与对象
-
类只是一种复杂数据类型的声明,不占内存;对象是类的实例化后的变量,占用内存.
-
在定义类时不能对成员变量进行初始化,因为没有地方存储数据.
-
通过对象名字访问成员使用点号.,通过对象指针访问成员使用箭头->.
-
在类体内定义的函数自动成为内联函数,而这种内联一般不是我们所期望的,所以实际开发中一般在类体内声明,而在类体外部定义.
-
一个类必须有构造函数,可以多个。构造函数常用来初始化,变量赋值或打开文件等.
四.智能指针(shared_ptr)
- 定义一个类的共享指针,则该指针就可以自由访问该类的所有方法和成员变量,并且在调用完毕之后自动释放内存.
- typedef std::shared_ptr Ptr; ## 定义了一个指向某个类的共享指针,则该指针可以访问该类的所有成员变量和成员函数.
- Classname::Ptr sp1 (new Classname); ## 初始化指针
五、继承与派生
-
C++中继承与派生是一个概念:“继承” – 是儿子接受父亲的产业; “派生” – 是父亲把产业传承给儿子.
被继承的类称为"父类 或 基类", 继承的类称为"子类 或 派生类".
常使用的名称为: 基类 (父类)和 派生类 (子类) -
派生类除了拥有基类的成员,还可以定义自己新的成员,所以"继承"的使用场景多为:相同的成员函数和成员变量被多个类使用时.
"派生继承示例:"
#include<iostream>
using namespace std;
//基类 People
class People{
public:
void setname(char *name);
void setage(int age);
char *getname();
int getage();
private:
char *m_name;
int m_age;
};
void People::setname(char *name){ m_name = name; }
void People::setage(int age){ m_age = age; }
char* People::getname(){ return m_name; }
int People::getage(){ return m_age;}
//派生类 Student
class Student: public People{
public:
void setscore(float score);
float getscore();
private:
float m_score;
};
void Student::setscore(float score){ m_score = score; }
float Student::getscore(){ return m_score; }
int main(){
Student stu;
stu.setname("小明");
stu.setage(16);
stu.setscore(95.5f);
cout<<stu.getname()<<"的年龄是 "<<stu.getage()<<",成绩是 "<<stu.getscore()<<endl;
return 0;
}
附加备注1:public-protected-privated 三个关键字的权限:
1). public、protected、private 三个关键字除了可以修饰类的成员,还可以指定继承方式;
2). public 可以成员可以通过对象来访问, protected 和 private 不能通过对象访问,可以通过成员变量访问;
附加备注2:关于三者的继承方式在派生类中的"使用"权限:(记住以下4点就OK)
1). 继承方式中的public、protect、provate代表了基类成员在派生类中的最高访问权限, 也就是说, public继承则派生类对基类中的不同访问权限的成员(三个关键字不同的访问权限)具有一样的访问权限.
2). 在任何继承方式中,private权限的函数都不能在派生类中调用.
3). 由于多种继承方式较为复杂,一般在实际开发中使用public继承。
4). 若在派生类中改变基类成员变量或成员函数的权限,可以用"using"关键字.
"在派生类中修改基类函数的权限:紧接上一个例子"
//派生类Student2
class Student2 : public People {
public:
void learning();
public:
using People::m_name; //将protected改为public
using People::m_age; //将protected改为public
float m_score;
private:
using People::show; //将public改为private
};