C++面向对象学习笔记(一)
C++面向对象学习笔记(一)
废话
最近在学C++后台开发这方面,在看侯捷老师的视频课,记录一些学到的新东西。由于笔者有一些C++的基础,所以一些基础的知识是不会在这里出现的。侯捷老师的课有讲很多关于C++的进阶内容,还是很不错的,就是讲话有点慢,得开倍速。有兴趣的兄弟们可以去看一看。
正文
1、内联函数
类的成员函数中,有一些可以成为内联函数。同样的函数体,成为内联函数会比普通函数运行效率更高。只有编译器能决定函数是否成为内联函数,而作为写代码的,有两种方式建议编译器把指定函数内联,然而编译器未必照办。第一种方法是在类内实现成员函数,也就是函数体写在类的大括号里面。第二种方法是在函数定义时加一个inline
。对于非类成员函数,也可以通过第二种方法变成内联函数。
内联函数说白了就是编译的时候编译器会把函数的代码复制到每一个调用函数的地方,这样相当于省了那一次函数调用,会稍微快一点。所以如果你想要内联的函数比较复杂,编译器大概率会拒绝。一般会把一些小的工具函数声明为内联函数。
2、构造函数初始化表达式
在类的构造函数时,如果想要初始化一些类的成员变量,有一种比在函数里赋值更方便的方式。
class someClass
{
public:
// 构造函数
someClass(int i) : someVariable(i) {}
private:
int someVariable;
}
这样不仅是看起来比较明显,而且在执行时会减少一步赋值。正常写法的话,执行时会先给someVariable
赋初始值(这里没有,就是0),然后再把传进来的参数i
赋值给它。利用初始化表达式,会直接将someVariable
的初始化用i
的值来进行,少了一步赋值。
相似的情况还有在调用一些有参数的构造函数时发生。(这里也可以认为是调用了someVariable
的一个有参数的构造函数。)
class father
{
public:
// 默认构造函数
father()
// 另一个构造函数
fatehr(int i) {}
}
class someClass : public father
{
public:
someFunction(int i) : father(i) {}
}
如果这里不使用初始化表达式,在子类的构造函数执行之前,会先执行父类的默认构造函数。使用初始化表达式可以用可以传参的构造函数,如果父类有很多构造函数的话,也可以手动指定想要的那一个。
对于不是父类,而是类内复合的其他类(不是用指针引用的成员类),也可以用相同的方式指定复合类的构造函数。
3、函数返回引用
C++中函数可以返回引用,这里指的不是返回指针。先给例子。
int &AddOne(int &i){
++i;
return &i;
}
int AnotherAddOne(int i){
++i;
return i;
}
//这是错的!
int &WrongAddOne(int i){
++i;
return &i;
}
不论是返回引用还是参数为引用,其本质都是传入和返回一个地址。使用地址的好处就是可以省下一个局部变量的创建。比如在上例第一个函数中,与第二个函数相比,传入和返回时各省下了一个临时变量。而在第三个函数中,i
是一个函数内部的局部变量,存在栈上,当函数返回后该区域就属于未知领域了,所以在返回之后仍使用i
的地址跟用野指针是一个性质。(虽然有时候这么写可以跑出对的结果,但是要避免!)
再补充一下,引用和指针的区别。一言以蔽之,引用就是一个指针常量。同一个变量的引用和指针的值都是它的地址值,是一样的。引用的特点在于它必须依赖于变量而存在,因此它永远不会是空。对于引用的所有操作会自动施加在原变量上,比如自增,sizeof
等。对于指针的操作会操作指向的地址值。
又是一段废话
好像写的有点长,写不完了。明天再写吧。