C++11中sizeof运算符,friend,final,override,模板函数的默认模板参数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yp18792574062/article/details/74853575

1、sizeof运算符

C++11sizeof运算符,我们知道在C++98中sizeof是不能直接计算结构体中的非静态成员变量的字节的

但是在C++11中这一点做出了改变,sizeof运算符可以直接计算结构体和类中的非静态成员变量的字节

struct People
{
	int age;
};
int main(void)
{
	struct People p;
	cout << "p.age:"<< sizeof(p.age) << endl;
	cout << "People::age"<< sizeof(People::age) << endl; //在C++98中会提示:illegal sizeof operand
	return 0;
}
上面代码在C++98中是无法通过编译的,但是在C++11中可以得到我们想要的结果

2、friend的扩展用法

在C++98中我么内使用友元类我们可能会这样写

class A;
class B
{
public:
	friend class A;
};
但是在C++11中我们可以省略class关键字,我们可以这样写

class C;
class D
{
public:
	friend C;
};

虽然这是一个小改变,但是带来一些应用上的变化,我们可以为类模板声明友元了

class P;
template<typename T>
class People
{
	friend T;
};
People<P> pp;
//在使用类P作为模板参数时,P是People的一个友元类
People<int> pi;
//在使用int作为参数时,People<int>会被实例化为一个普通的没有友元类的类型
3、final

final可以在派生的过程中阻止一个接口的可重载性,意思就是它在派生类中不能被重写,final修饰的是虚函数

class Base
{
public:
	virtual void function() final
	{

	}
};
class Derived :public Base
{
public:
	/*
	void function()  //这个时候它会报错,提示为无法重写final函数
	{

	}*/
};
4、override

override的用法,它用在派生类中,表示这个函数必须是被重写的,要求这个函数在基类中是虚函数

class Base1
{
public:
	void display()
	{

	}
	virtual void show()
	{

	}
	virtual void Operation()
	{

	}
};
class Derived1 :public Base1
{
public:
	/*
	void dispaly()override //编译错误,会提示:使用override声明的成员函数不能重写基类成员
	{

	}
	
	void fun()override //同样也会编译错误,错误提示和上面一样
	{

	}*/
	void Operation()override //正确
	{

	}
	void show()override   //正确
	{

	}
};
5、模板函数的默认模板参数

在C++98中,我们可能给类模板设置过模板默认参数,但是给函数模板设置默认参数却没有出现过

template<typename T = int>
class DefClass
{

};
template<typename T = int,int i = 0>
void DefTemp(T a)
{

}
在C++98中这样写是不正确的

但是在C++11中是可以的,不过在语法上和类模板是不同的,类模板指定参数时必须遵照从右往左的规则进行指定

//在编译的时候会报错
/*
template<typename T1 =  int,typename T2>
class Def1
{

};*/
template<typename T1,typename T2=int>
class Def2
{

};
//Def1<int> d1;  //这样写就会报错
Def2<int> d2;
//下来我们看函数模板指定默认参数时
template<int i = 0, typename T2 = int>
void DefFun1(T2 b)
{

}

template<typename T1 = int, typename T2>
void DefFun2(T1 a)
{

}

6、局部和匿名类型作为模板实参
template<typename T>
class X
{

};
template<typename T>
void fun(T a)
{

}
typedef struct
{
	int a;
}B;//这里B就是一个匿名类型
void Show()
{
	struct {} c; //局部变量
	X<B> x;  //C++98中失败
	fun(c);  //C++11中成功
}





猜你喜欢

转载自blog.csdn.net/yp18792574062/article/details/74853575