1.typedef
typedef一般是对某种类型的类型别名(不是变量别名)
typedef double db;
void mixtypename()
{
db d=1.2;
cout<<d<<endl;
}
db就是double的别名,一般情况下,使用typedef一般可以认为是类型别名的替换
但是也有例外
typedef char * ps;
void mixtypenameexcept()
{
char a='s';
char b='a';
const ps cstr=&a;
cstr=&b;
}
当编译这段代码时,会报错
这说明cstr是const指针,而不是指向const变量的指针
也就是说
const ps cstr等价于char *const cstr
const ps cstr不等价于const char *cstr
2.static_cast
static_cast用来强迫隐式转换。那么经常出现的隐式转换有哪些?1、用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。2、指针或引用之间的转换,比如 void*转为float*,或者将base*转为derived*。3、将非const对象转为const对象。
void mixtypecast()
{
double d=3.14;
int i=static_cast<int>(d);
void *vp=&i;
int *pi=static_cast<int *>(vp);
cout<<i<<endl<<*pi<<endl;
}
int i=10;
const double d=static_cast<double>(i);
base *pb=new base();
derive *pd=new derive();
base *pb2=static_cast<base*>(pd);
derive *pd2=static_cast<derive*>(pb);//not safe
base b;
base &rb=b;
derive &rd=static_cast<derive&>(rb);//not safe
上述代码中的L6、9发生了向下转化,是不安全的(因为编译期的类型转换有可能会在运行时出现错误,特别是类对象的指针或引用),所以就有了dynamic_cast,dynamic_cast见https://blog.csdn.net/Master_Cui/article/details/110520918
3.const_cast
const_cast通常被用来将对象的底层const属性。所以,const_cast一般用于const对象引用和const对象的指针,但是不能用于const对象
示例
void mixremoveconst()
{
const int &a=10;
int &b=const_cast<int &>(a);
const int *pa=&a;
int *p=const_cast<int *>(pa);
cout<<p<<endl<<b<<endl;
}
示例2
const int cb=20;
int b=const_cast<int>(cb);
cb中的const是顶层const,所以不能用const_cast来强转,否则会出现如下错误(提示被转换的表达式不是指针也不是引用)
4.一次循环遍历二维数组
void twodimarray()
{
int a[3][4]={1,2,3,4,5};
for (int i=0;i<3*4;++i) {
cout<<a[i/4][i%3]<<endl;
}
}
行下表为数组元素索引除列数,列下表为数组元素索引对行求余
5.聚合类
聚合类的特点:1.所有成员都是public。2.没有定义任何构造函数,全有编译器自动生成。3.没有基类。4.没有类内初始化
可以使用列表初始化对聚合类进行初始化,成员初始化的顺序必须和成员的定义顺序一致
class agg
{
public:
int a;
string str;
};
int main(int argc, char const *argv[])
{
agg t={10,"qwe"};
cout<<t.a<<t.str<<endl;
return 0;
}
上述代码中的10和qwe的位置不能颠倒
参考:
《C++ Primer》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出