一、封装指的是将数据以及使用它们的方法进行逻辑编组
二、数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节。(使用private关键字实现数据抽象,类外任何人不能访问,友元除外)
三、struct与class
1、相对于C中struct,C++做了很大的扩充。基本上和class 差不多。只有一些细节上的差别。
2、对于成员的默认访问权限,class是private,struct是public。需要注意的是,程序中应该明确指出访问权限,不要依赖默认的访问权限。对于其它默认的情况也是一样,尽量明确指出来,这是一个良好的编程习惯,增加代码的可读性。
3、对于默认的继承方式,class是private,struct是public。需要注意的是,class可继承class,也可继承struct。struct可继承struct,也可继承class。默认的继承方式取决于子类是struct还是class。和上面一样,这里应该明确指出继承方式,而不应该依赖默认。
4、对于struct和class,都可以使用使用{}来赋初值,前提是:a、字段是public,因为public才可以直接访问;b、没有父类,没有自定义构造方法和虚方法,可以有普通的成员方法。可以认为,继承,自定义构造方法,虚方法改变了类的内部结构,因此编译器禁止使用{}赋初值。
5、定义模版参数,使用typename,也可以使用class。但是不能使用struct。
四、构造函数
默认构造函数是调用时可不提供参数的构造函数(若无默认,编译器自动创建成员属性,但不可初始化POD类型如int,字符,原始指针属性),重载构造函数,可以创建一个将姓名作为参数的构造函数,重载构造函数很有用,可以帮助初始化变量。没有默认构造函数,自己又有重载构造喊,C++编译器不会为此生成默认构造函数。也有带默认值的构造函数参数Human(string Humanname =“kj”,实例化human对象可以不提供参数)。包含初始化列表构造函数(Human(string Inputname,int Inputage):Name(Inputname),Age(Inputage){})
五、析构函数
对象销毁时自动调用,重置变量以及释放动态分配的内存以及其他资源的理想场所
六、复制构造函数
浅复制:复制类对象,复制指针成员,但不复制指针所指向的缓冲区,其结果就是,两个对象指向同一块动态分配的内存。导致不再有有效的地址调用delete(销毁其中一个对象时释放其内存,导致其无效)
复制构造函数是一个特殊的重载构造函数,编写类的成员需提供。每当对象被复制(包括将对象按值传递给函数),编译器都将调用复制构造函数。复制构造函数接受一个以引用方式传入的当前类的对象作为参数,这个参数是源对象的别名,确保对所有缓冲区进行深复制。Mystring(const Mystring& CopySource)
Mystring SayHello("hello")
UseMystring(SayHello)
若overwrite= SayHello 赋值操作 没有指定任何赋值操作符,编译器提供的默认赋值元素安抚将导致浅复制。为避免赋值进行浅复制,需要实现复制赋值运算符
MyString ::operator= (const MyString& CopySource)
{}
七、this指针
一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。
this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。例如,调用date.SetMonth(9) <===> SetMonth(&date, 9),this帮助完成了这一转换 .
在成员函数内部,我们可以直接使用调用该函数的对象的成员,而无需通过成员访问运算符来做到这一点,因为this所指的正是这个对象。任何对类成员的直接访问都被看成this的隐式使用。
this的目的总是指向这个对象,所以this是一个常量指针,我们不允许改变this中保存的地址。
一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。