语言语法糖_C++小知识——语法糖和纯虚函数的注意点

48f739da472da1c1fed0c8f340ae36fe.png

语法糖,英文是syntactic sugar,原来一直没注意它的意思,只是固定的将它定义成了一个类似固定符号的东西,在《C++编程思想》,上面把运算符的重载这种语法糖,翻译成了“语法上的方便”,而在词典上一般译成“语法上的甜头”,顾名思义,这才真得明白为什么大老外把这类东西叫语法糖,包括在C++11中对Lambada表达式也称做是语法糖,在语法上给你个小好处,小甜头,让你吃着方便,品着顺心。原来这才是人家真正的意思。看几个语法糖的例子:

//lambda表达式,自动返回值和显示指定
auto x = [](int a){return a++;}
auto x = [](int a)->int{return a++;}
std::string r = [](const std::string & str) { return "my  " + str; }("result");

//遍历
int arr[] = {1,2,3,4,5,6};

for (auto x : arr)
{
    std::cout <std::endl;
}

//类型推导
struct Test
{
    int d;
};

Test *test;
decltype(test->d) dd ;
dd = 9;

还有很多,通过上面的语法,是不是觉得c++不再是一个刻板的语言了?c++确实在发展。

另外在其第15章“多态和虚函数”中它提到“注意,纯虚函数禁止对抽象类的函数以传值方式调用。这也是防止对象切片的一种方法,通过抽象类,可以保证在向上类型转换期间总是使用指针或者引用”。这里切片(Object Slicing)是什么含义呢?其实也很简单。就是在定义一个父类和一个子类时,如果你在调用函数时采用了传值的方法,那么大家都知道,是无法形成多态的,最终只是会调用父类的方法或者说函数。那应用到普通的继承里至少还不能说语法上有错误。毕竟可以编译运行。但是有纯虚函数的类就是抽象类,而抽象类一般是不允许形成实例对象的,这样你在调用纯虚类的父类对象时,编译器就会阻止你,同时报出一个错误。或者你干脆可以理解,如果可以使用的话,就会与纯虚函数存在的意义相悖(即抽象类不能生成实例对象)。
但是实际情况是一种什么情况呢?其实就是上面讲的切片,如果你使用非指针或者引用传递子对象的话,但是其传递参数为父对象,那么编译器只会拷贝与父对象大小的数据到参数,从而导致你的实际情况与想象不同,这些话说起来有些别扭,实际就是无法形成多态,看下面的代码就明白什么是切片了:

class Base
{
public:
   virtual void GetData(){return d;}
private:
   int d;
};
class Derived:public Base
{
public:
   void GetData(){return d;}
private:
   int d;
};
void GetDataFromBase(Base b)
{
   int tmp = b.GetData();
}
int main()
{
   Base b;
 Derived d;
   GetDataFromBase(b);
   GetDataFromBase(d);
}

C++的学习难度和学习曲线都是不友好的,但c++发展的方向是友好的,最后c++会走到什么地步,还得拭目以待。

ee994527327b0fff6f5b43c87a8de9f4.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值