C与C++不同点
基本语法(const 引用 函数重载等)
类(class)
c11新语法(匿名函数,智能指针,bind,function,cast等等)
基本语法
bool关键字
表示成功或者失败逻辑值
占1个字节。true = 1 false = 0
const关键字
const + 指针
const Type* p /Type const* p(Type表示类型)表示不能修改指针指向的内容,指针本身的值是可以修改。 const char* p="hello,world!\r\n";
char const* q="hello,wolrd!\r\n" //会自动编译成const char*
p[0]='a'; //编译不通过,p指向的内容不能修改
p="haohaoxuexi\r\n"; //编译通过,p可以重新指向其他字符常量
T* const 表示是该指针是一个常量,意味指针本身的值不能被修改,但是指针指向的内容可以修改。 char buf[32] = "hello,world\r\n";
char* const p = buf;
p[0] = 'a'; //编译通过,可以修改p指向的内容
p = nullptr; //编译不通过,p不能指向其他地方
const T * const表示指针指向的内容及指针本身均不能改变。 char buf[32]="hello,world\r\n";
const char* const p=buf;
p[0]='a'; //编译不通过
p=nullptr; //编译不通过
const_cast类型转换
常成员函数——const加在最后
1)作用
2)本质
普通的类成员函数this指针类型:T* const(表示该指针不能被修改)
常成员函数this指针类型:const T* const(表示指针指向的内容,且指针都不能修改)
3)意义
让编译器提醒开发者该函数不能修改类的成员变量,用于const对象(引用或指针)
class Object
{
public:
int GetNumber() const
{
m_number = 10; //编译报错,不能修改m_number的值。原理:此时传入的this指针是
//const Object* const类型,即m_number=10等价于this->m_number=10,不能修改!
return m_number;
}
void SetNumber(int number)
{
m_number = number;
}
private:
int m_number;
};
int main()
{
Object obj;
int n=obj.GetNumber();
return 0;
}
4)破除常成员函数的办法
强转指针类型(将const T* const强转成T* const)
在变量前加上mutable(关键字:多变的)
class Object
{
public:
int GetNumber() const
{
Object* const p = (Object* const)this; //方法1 强转
p->m_number = 10;
return m_number;
}
void SetNumber(int number)
{
m_number = number;
}
private:
mutable int m_number; //方法2 加关键字mutable
};
常成员变量——const加在最前
必须声明时赋初值,否则编译不通过
使用初始化列表(详情见10)
class Object
{
public:
Object():m_number2(40) //初始化列表
{
}
private:
const int m_number1=10; //此方法不推荐,编译器版本低会报错
const int m_number2;
};
int main()
{
Object obj;
return 0;
}