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中成功
}