zoukankan      html  css  js  c++  java
  • C++语法疑点

    1函数模板不支持偏特化

    2类内部的typedef 必须放在最前面,不然没法用:

      疑问:为什么类声明处定义的函数体中能出现在后面在声明的成员变量??因为C++对于成员函数函数体的解析是放在整个类声明完毕之后的.

    3const vs nonconst member function

         注意成员函数的const属性限定并不出现在重载决议中,如果在一个基类中定义了一个成员函数memfunc1(), 然后定义了它的nonconst version

    则在派生类里面无论定义一个 const memberfunc1()还是nonconst memberfunc1(),都会覆盖基类的那两个函数,比如下面代码:

    class Base{
    public:

        virtual  void sayHello()
        {
            static int local = 0;
            local++;
            a = local;
            cout << "hello from nonconst"<<endl;
            cout << a;
        }
        virtual void sayHello() const
        {
            cout << "hello from const" << endl;
        }
    private:
        int a;
    };

    class Derived:public Base
    {
    public:
        void sayHello()
        {
            cout << "derived" << endl; //派生类的const 对象再也调用不了sayHello函数了
        }

    };
    关于这一点,可以参考访问控制权限类似的设计,因为名字决议是先于访问控制权限的检查的

    4函数返回值并不在name mangling之列,所以从这个角度讲,函数调用也没有达到绝对的类型安全(返回值搞错了的话编译器是检查不出来的)

    5 pointer to data member

       首先要意识到这是一种指针(可以赋值为nullptr,那样用%d就输出 -1),用printf(%d)输出的就是所指成员变量在类中的偏移

    #include<iostream>
    using namespace std;
    
    class Point3d
    {
    public:
        //virtual ~Point3d(){}
    
        //static Point3d origin;
        float x;
        float y;
        float z;
    };
    
    struct Base1{int val1;};
    struct Base2{int val2;};
    
    struct Derived:Base1, Base2{};
    
    void func1(int Derived::*dmp, Derived* p, const Derived& p2)
    {
        cout << p->*dmp << endl;
        cout << p2.*dmp << endl;
    }
    int main(int argc, char** argv[])
    {
        Point3d p;
        float Point3d::*p1 = nullptr;
        float Point3d::*p2 = &Point3d::x;
        if(p1 == p2)
            cout << "YES";
        printf("%d %d
    ", p1, p2);
        Derived d1, d2;
        d1.val1 = 2, d1.val2 = 3;
        d2.val1 = 4, d2.val2 = 5;
        func1(&Derived::val1, &d1, d2);
        return 0;
    }
    

    6关于调用虚函数的开销

      区分三种类型:普通对象,引用类型,指针类型

      指针不用说,额外增加是间接性很容易理解

      引用类型调用函数的格式看起来和对象类型是一致的,但调用虚函数的开销却和指针一样

      普通对象调用虚函数就像调用一般的函数一样,没有额外开销

    7violatile关键字修饰的作用

      被volatile关键字所修饰的变量,只不过是每次使用的时候,都必须从(原始的)(存储变量内容的) 内存 中读取数据,写数据也应该要保证写到内存中去

          不允许寄存器优化

    8基于函数指针和直接的函数名的调用方式上完全一样:

      这完全是为了方便.

          还有一点,函数地址和数据地址是两个东西(一个指示代码段,一个指示数据段),所以把void*类型变量赋值成函数指针是错误的做法!

    9 In C++, tentative definitions are not supported

    10 One difference between C and C++, then, is the relative unimportance of the BSS data segment in C++. All global objects within C++ are treated as initialized.

     
  • 相关阅读:
    asp.net在线压缩和解压缩的实现 VS2005
    Office组件配置
    您无权查看或编辑目前 F:\XXX 的权限设置;但是,您可以取得所有权或更改审核设置
    23条心灵寄语献给在创业一线的兄弟姐妹
    IIS 环境下 w3wp.exe 进程 CPU 占用过高的解决方案
    SQLServer修改表所有者
    走出软件作坊推荐
    Asp.net 的 服务器推技术 (Server Push)
    上海火车站售票点
    Newtonsoft.Json.dll 本地调用正常,服务器调用不正常
  • 原文地址:https://www.cnblogs.com/hustxujinkang/p/4975859.html
Copyright © 2011-2022 走看看