C++知识点杂记1——typedef、static_cast、const_cast、遍历二维数组、聚合类

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》

 

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值