1.定义在类内部的函数是隐式的inline函数,this是一个常量指针,不允许改变this中保存的地址。
2.const:成员函数有下面三种形式:
MyClass::doSomething (int&) const;
const MyClass::doSomething (std::string&);
const MyClass::doSomething (std::vector<int>&) const;
关键点就是形参表后面的那个const的作用是修改默认隐式this指针的类型,原本这个this指针只有着顶层const,没有底层const,在成员函数后面加上这个
const之后,那么这个this指针就会拥有底层const,如果我们没有写这个const,那么我们实例化的对象如果是const对象,那么我们就不能调用这个成员函数:
#include <iostream>
#include <string>
class MyClass
{
public:
MyClass(int data, std::string& name) : data(data),name(name) {}
~MyClass(){}
const std::string& getName() const
{
return name;
}
int& getData()
{
return data;
}
const void con () const
{
std::cout << data << name << std::endl;
}
private:
int data;
std::string name;
};
int main(int argv, char* argc[])
{
std::string first("zhang"),second("ling");
MyClass nonconst(21,first);
const MyClass hasconst(22,second);
nonconst.con();
hasconst.con();
std::cout << hasconst.getName() << std::endl;
hasconst.getName()[4] = ' ';
hasconst.getData() = 100;
std::cout << hasconst.getData() << std::endl;
}
这一段代码是不能通过编译的,原因有两个:int& getDate()这个函数,我是用const的成员来调用它的,但是由于形参表后面没有const,那么this指针就
不能绑定到const对象上面,所以就有错,第二个错误是 hasconst.getName()[4] = ' ';这一句,这个试图在返回const引用的结果上面改变内容,显然不合法。
所以const出现在函数头代表的是,这个函数返回的值是const的,const出现在成员函数的形参表之后,那么就是代表让指向这个对象的this指针拥有了底层const的性质,并且这个成员函数只能被const对象调用,non_const对象不能调用这种函数,反过来也一样,const对象不能调用在形参表后面没有const的成员函数。
常量对象,常量指针或者常量对象的引用都只能调用常量成员函数(形参表后面有const)
3.执行输出任务的函数应该尽量减少对格式的控制,好让用户能自己控制格式。
4.构造函数:类内初始值:在声明这个类的成员变量的同时,就给予它们初始值,在这个前提下,我们就可以这样写: MyClass() = default;
这一句表示:我们需要默认的行为,让编译器生成构造函数,我们希望这个函数的作用完全等同于之前使用的合成默认构造函数。c++11
5.可变数据成员:一个可变数据成员永远都不会是const,即使它是const对象的成员。mutable Type name;这样就可以声明一个mutable变量
6.成员变量的初始值:std::string name = " ";....就像在平常我们声明变量一样,只是说这次在类内部写,和前面的 = default ;这个特性结合起来,
调用默认的构造函数,那么就会用这些初始值来初始化对象,好处就是不用自己手动去写默认构造函数的初始值列表 c++11
7.委托构造函数:一个委托构造函数使用它所属类的其他构造函数执行它自己的初始化过程,用 : 来表示委托 c++11