c++知识点和总结()
对象(基本)
权限控制(visibility for members of classes)
- classes的默认权限是private, structs的默认权限是public(兼容C), 这一点和JAVA是不同的。
定义类时需要注意的事项
类体中不可对类进行初始化(尝试了下,编译没有报错,且初始化是有效的, C++11)- 类的成员可以是另一个类, 要使用到的类最好提前定义, 否则要提前声明???
- 在类体内实现的函数是内联函数,在类体外实现的函数可以加inline来表示该函数是内联的, 编译阶段内联函数会直接以函数体内的内容扩展到调用处, 而非内联函数则需要发生函数调用(保护现场, 跳转, 返回)
对象成员的表示方法
- CLS *c1 = new CLS(); CLS c2 ; c1->member 等价于(*c1).member 等价于c2.member
类对象的存储空间
- C++仅为类的数据成员分配内存空间, 类中的所有成员函数都只有1个放在公用区(?)的副本, 类仅会存储自身的数据成员和指向成员函数地址的指针变量
构造函数
-
拷贝初始化构造函数:使用类的引用初始化另一个对象,
CLS::CLS(CLS & anotherCLS){} CLS::CLS(const CLS & anotherCLS){}
对象的深复制和浅复制
语法规范
- 在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数即浅拷贝,它能够完成成员的一一复制。当数据成员中没有指针时,浅拷贝是可行的;但当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一个地址。
- 当一个对象结束时,会调用析构函数,如果析构函数中有delete 相应内存, 就会导致而导致另一个对象的指针指向的数据无效。所以,此时,必须采用深拷贝。
- 深拷贝与浅拷贝的区别就在于深拷贝会在堆内存中另外申请空间来储存数据,从而也就解决了和指针相关的问题。当数据成员中有指针时,必须要用深拷贝。
为什么下面的代码没有报double free的问题呢?
#include <iostream>
const size_t array_size = 10;
using namespace std;
class Test
{
private:
void InitP(){
for (size_t i = 0; i < array_size; i++){
p[i] = 3 * i;
}
}
public:
int *p;
Test(){
p = new int[array_size];
InitP();
}
void showP(){
for (size_t i = 0; i < array_size; i++){
cout << "address: p[" << i << "]"
<< "=" << &(p[i]) << " ";
cout << "value: p[" << i << "]"
<< "=" << &(p[i]) << endl;
}
}
~Test(){
cout << "deconsture was called" << endl;
delete[] this->p;
}
};
int main(){
Test t;
t.showP();
Test s = t;
s.showP();
return 0;
}
静态成员
- 静态成员变量是属于整个类的,整个类(所有类的对象中)只有一份拷贝,相当于类的全局变量(这是对于同一进程内而言, 多进程间无效)。
- 静态成员变量不能在类的内部初始化,在类的内部只是声明,定义必须在类外,定义时不能加上static关键字。
- 静态方法只能直接使用静态成员变量和方法, 若想使用非静态成员或函数, 只能通过对象来间接调用。
代码解析
X& operator=(const X& a ) X(const X& a)
看着有点复杂, 但是可以逐个分解着来看
- X(const X& a):X的构造函数, 参数为一个a的常引用
- X& operator=(const X& a ): 重载了=, 返回的是一个引用
Readlist
- 为什么函数不能根据返回类型来区分重载?, 这个自己一直有误解, C++, Java都要注意
- default visibility of C++ class/struct members
- 类中成员函数的实现,放在类块里和外部实现的区别
- 新编C++语言习题与解析,李存葆,喻丹丹等著, 清华大学出版社
- 类的成员变量