函数指针和成员函数指针无法用于 const_cast const_cast 使得指向非 const 类型的 const 引用或指针能够被修改 通过 const_cast 修改 const 对象是未定义的行为 struct type { int i; type(): i(3) {} void f(int v) const { // this->i = v; // compile error: this is a pointer to const const_cast<type*>(this)->i = v; // OK as long as the type object isn't const } }; int main() { int i = 3; // i is not declared const const int& rci = i; // const reference const_cast<int&>(rci) = 4; // OK: modifies i std::cout << "i = " << i << '\n'; const int* pci = &i; // *pci = 5; // error: assignment of read-only location ‘* pci’ *const_cast<int*>(pci) = 5; // OK: modifies i std::cout << "i = " << i << '\n'; type t; // if this was const type t, then t....
一、转换函数 Conversion Functions(operators) 在 C++ 中,使用类作为具体类型,对现实世界对象进行抽象。有时,需要隐式地将一种具体类型转换为另一种具体类型或 C++ 内建数据类型。转换函数在这种情况下发挥着重要作用。它类似于类中的运算符重载函数。
转换函数写法:operator typeName();
转换函数必须是类的成员函数 转换函数不能指定返回值类型 转换函数不能有形参 例如下面的类:
class Fraction { public: Fraction(int numerator, int denominator = 1) :m_numerator(numerator), m_denominator(denominator) { } //转换函数 operator double() const { return (double)m_numerator / m_denominator; } private: int m_numerator; //分子 int m_denominator; //分母 }; int main() { Fraction f(8,5); double d = 4 + f; cout << d << endl; return 0; } 输出:...
在编译过程中就已经把值计算出来,会做类型检查; define 是在预编译过程中进行简单的文本替换,不会做类型检查; 在对象声明时或非静态成员函数中使用 constexpr 关键字(C++ 14)暗示这个对象或非静态成员函数是 const 的; 在函数或静态数据成员(C++ 17)声明中使用的 constexpr 关键字意味着内联; C++11 中 constexpr 函数可以使用递归,?: 三目运算符,从 C++14 开始,constexpr 函数可以在内部使用局部变量、循环和分支等简单语句; constexpr 修饰的是函数参数,而不是函数返回值,函数返回值是可以被改变的 constexpr 修饰变量必须满足以下要求:
它的类型必须是一个LiteralType 它必须立即初始化 其初始化的完整表达式,包括所有隐式转换、构造函数调用等,必须是 constexpr 它必须有 constexpr 析构 constexpr 修饰函数必须满足以下要求:
它不能是 virtual 修饰的(直到 C++20) 它不能是 coroutine 协程(直到 C++20) 它的返回类型(如果有的话)必须是 LiteralType 所有参数必须是 LiteralType class Test{ public: int x = 10; }; int main() { constexpr Test t; // const cout << typeid(t....
包装指定调用标签(如 double(double) 返回值类型为 double,参数也是 double 类型)的函数; 替代以前的函数指针、函数对象和 lambda 表达式; 类模板 std::function 是一个通用的多态函数包装器。 function 的实例可以存储、复制和调用任何 CopyConstructible Callable 目标: 函数 lambda 表达式 std::bind 表达式 函数对象 指向成员函数的指针 指向成员属性的指针 可以减少生成的模板函数实例化代码的数量,缩小可执行文件的大小; 参考:
std::function