Cre*_*ing 5 c c++ casting const
我通常在C/C++代码中使用C类型转换.我的问题是,在构建类型中添加"const"关键字是否意味着结果的任何内容?
例如,我可以想出几个场景:
const my_struct *func1()
{
my_struct *my_ptr = new my_struct;
// modify member variables
return (const my_struct *)my_ptr;
// return my_instance;
}
Run Code Online (Sandbox Code Playgroud)
在这一个中,该函数构造一个struct的新实例,并将其转换为常量指针,因此除了删除它之外,调用者将无法进一步修改其内部状态.是"const"转换是必需的,推荐的还是简单的不必要的,因为任何一个return语句都有效.
在这一个中,my_base是基类my_derive.
const my_base *func2(const my_derive *my_ptr)
{
return (const my_base *)my_ptr;
// return (my_base *)my_ptr;
}
Run Code Online (Sandbox Code Playgroud)
因为my_ptr已经是一个const指针,所以会在转换时使用(my_base *)const_cast来删除const和另一个隐式const_cast吗?
是否有任何理由将"const"添加到整数函数参数中,因为更改它永远不会影响函数外的状态?
void func3(const int i)
{
// i = 0; is not allowed, but why, as it is harmless?
}
Run Code Online (Sandbox Code Playgroud)
如何在转换整数时添加"const"?我觉得这应该很像func2().
void func4(short i)
{
const unsigned int j = (const unsigned int) i;
// const unsigned int j = (unsigned int) i;
}
Run Code Online (Sandbox Code Playgroud)
如我错了请纠正我.考虑类型转换可能是常见问题解答,我不确定这个是否与其他任何内容重复.谢谢!
const在转换类型中添加关键字意味着结果将是常量.以下内容不能用C++编译(在C中没有效果):
int* x = (const int*)malloc(10); // cannot convert from 'const int *' to 'int *'
Run Code Online (Sandbox Code Playgroud)
你真的不应该在你的C++代码中使用C类型转换.它不安全,只能用于与传统C代码的兼容性.您应该使用C++强制转换.
在func3通常const不使用限定符的情况下.const如果没有指针或不是引用类型,那么将限定符添加到函数参数没有什么大的理由.考虑以下:
void func3( TYPE i); // no reason to use `const`
void func3(const TYPE& i); // use `const`, so as not to accidentally change `i`
Run Code Online (Sandbox Code Playgroud)
将左值赋给rvalue时,就像在中一样func4,不需要const在强制转换表达式中显式指定限定符.Lvalue-to-rvalue转换将根据C++标准4.1隐式执行.
添加const到强制转换就像添加const到任何其他类型说明符---结果对象是const.这意味着什么取决于上下文.如果您添加const在顶层(如const int或const foo或者int* const,你只是有一个const对象.在大多数情况下,这可以被复制和分配,就像一个非const对象可以(虽然有少数例外,如std::auto_ptr).
如果添加const到指针,则还可以将其添加到指向类型.例如,int * const是const指向普通的指针int,而是const int*或是int const*指向a的普通指针const int.
int i;
int* p = (int* const) &i; // fine; top-level const not a problem
int* p2 = (int const*) &i; // error; pointed-to object is const, so this is preserved
int const* p3= (int const*) &i; // OK
Run Code Online (Sandbox Code Playgroud)
const在参数声明的顶层就像声明任何其他局部变量const---你不能修改函数体内的命名对象.但是,这const不构成函数类型的一部分,因此您可以在没有(至少符合编译器)的情况下正向声明该函数.
void func(int i); // forward-declare func
void func(const int i) // this matches the declaration
{
// i is const here
}
Run Code Online (Sandbox Code Playgroud)
这可以被认为是好的风格---无论变量是否被视为const函数内部是一个实现细节,所以不应该在原型中.在定义中,const如果您不打算修改它,它将遵循声明某些内容的指导原则.
const在参数声明中的其他地方使用(例如作为指针的一部分)会影响函数类型,就像强制转换一样.