-
左值代表着一块可以被更新的内存区域,可以被取地址,右值不能被取地址。
-
初始化是指创建对象的同时给它赋初值,赋值是擦除对象的当前值并用新值代替。
-
内存泄漏是调用了malloc/new等内存申请操作,但是缺少对应的free/delete来释放内存。
-
类的定义不会引起数据的内存分配,实例化对象才会给这个对象分配存储空间。(类对象所占的存储空间等于它的数据成员所占的空间(不包含成员函数代码所占的空间),每个类对象都有自己的数据成员。)
-
类的声明
//定义两个类A和类B, 类A中有一个指向类B对象的指针,类B中有一个类A的对象。 #include <stdio.h> class B;//类的声明一般用于定义指向该类型的指针和引用。没有定义,不能实例化 //用于编写具有依赖关系的类。 class A { B* pB; B &func(B *b, B &bb) { b = NULL; } //用于使用该类型作为函数形参类型或者返回值类型 }; class B{ A aobj; }; int main() { return 0; }
-
在C++中类和结构体有两点不同:
- class默认的成员属性是private ,struct默认的成员属性是public。
- 在继承层面:class默认的继承方式是私有继承,而struct默认的继承方式是公有继承。
-
内联函数
-
内联函数是为了解决C++预处理宏存在的问题(1、宏不能访问对象的私有成员。2、宏的定义很容易产生二义性。)所提出一种解决方案,用来提高程序的运行效率。
-
在调用内联函数时,并不真正执行函数的调用过程,只是把函数的代码嵌入到程序的调用点,减少了函数调用的开销。
内联函数使用inline关键字定义。
关键字和函数定义必须结合在一起,否则编译器将它作为普通函数对待。
在类内部定义的成员函数自动视为内联函数,不需要加关键字inline。
内联机制适用于优化小的,只有几行的,且频繁被调用的函数(如获取或者设置类数据成员的函数)。
类的普通成员函数一般在源文件内定义,类的内联成员函数最好在头文件中定义。
- this指针
C/C++中的成员函数,相当于C中的函数,只是被编译器改过名字,并增加一个this指针参数(对象的地址),通过偏移量来访问对象的数据成员。所以对象的大小和函数无关,实际上是通过类的作用域呼叫函数。每个成员函数都有一个隐含的形参this,指向调用成员函数的类对象。
在调用成员函数时,this被初始化为调用函数的类对象的地址
#include <iostream>
class Student{
private:
int age;
public:
void setAge(int age){//在成员函数中,不需要显式的使用this指针来访问对象的成员,默认其成员为通过指针this实现的引用。除了形参名和数据成员名字一样的情况,如果没有this就近原则就容易出错。
this->age = age;
}
Student &getObj(){//当需要将一个类对象作为整体引用时,需要显式的使用this。
//code...
return *this;//一般是赋值运算符重载,连续赋值会用到
}
};
int main()
{
Student stu1;
/*
(gdb) p &stu1
$1 = (Student *) 0x7fffffffdf10
*/
stu1.setAge(18);
/*
(gdb) s
Student::setAge (this=0x7fffffffdf10, age=18) at this.cpp:7
7 this->age = age;
*/
stu1.getObj().setAge(17);
return 0;
}