#学习自用#
mutable
mutable是C++中的关键字,可以类中与常量方法配合使用,可以在lambda表达式中使用。
#include<iostream>
#include<string>
using namespace std;
class X
{
private:
int m_x ,m_y;
mutable int i;
public:
int getx()const
{
i=0;
return m_x;
}
};
void func(const X&x)
{
cout<<x.getx()<<endl;
}
void main()
{}
这里func的形参调用的是常量引用,则调用的方法getx也必须是常量,const加在括号之后(只有类的方法可以这样写)表示的不是不能改变成员变量,也就是说在getx中对m_x赋值是非法的。而mutable使得可以在常量方法getx中修改变量i。
类中的成员初始化
类中成员初始化一般有两种方法,一是在构造函数中进行赋值,二是在构造函数的参数之后添加冒号对,变量以及赋值进行说明。
#include<iostream>
#include<string>
using namespace std;
class entity
{
private:
string m_name;
int index;
public:
entity(string& name)//删除&
{
m_name=name;
index=0;
}
entity()
:m_name("lee"), index(1)
{}
void printname()
{
cout<<m_name<<endl;
}
};
void main()
{
string name="odd";//string可改为char*
entity e1(name);
e1.printname();
entity e2;
e2.printname();
cin.get();
}
在打代码的时候发现有个有趣的事,std::string本身是一个类,所以当构造函数形参接收类型为string&时只能接收string类型的变量,但是当引用符号去除之后,构造函数则可以接收char*类型的参数传入(也就是可以传入地址)。
在第二种初始化的方法上稍加变化。
class entity
{
private:
string m_name;
int index;
public:
entity(string& name)
:m_name(name),index(1)
{}
void printname()
{
cout<<m_name<<endl;
}
};
初始化方法更推荐使用第二种,因为第一种在某些情况下会造成性能损失。
#include<iostream>
#include<string>
using namespace std;
class example
{
public:
example()
{
cout<<"creat entity"<<endl;
}
example(int x)
{
cout<<"creat entity"<<x<<endl;
}
};
class entity
{
private:
example m_exam;
public:
entity()
{
m_exam=example(8);
}
};
void main()
{
entity e1;
cin.get();
}
创建e1时产生了两个example类,一个在成员定义处,调用了第一个构造函数,一个在example(8),调用了第二个构造函数,我们期望的是直接创建一个example(8)的实例,所以第一个创建其实是多余的。使用第二种初始化的定义方法就可避免这种浪费。