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.

     
  • 相关阅读:
    7、NFC技术:让Android自动运行程序
    6、Android中的NFC技术
    5、NFC概述
    Delphi XE7中开发安卓程序一些有用的帮助资源
    Delphi开发安卓程序的感受
    Tomcat绿色版启动"startup.bat"一闪问题的解决方法!
    Delphi判断字符串中是否包含汉字,并返回汉字位置
    Delphi的DLL里如何实现定时器功能?
    Delphi的DLL里如何实现定时器功能?
    VS2013如何添加LIb库及头文件的步骤
  • 原文地址:https://www.cnblogs.com/hustxujinkang/p/4975859.html
Copyright © 2011-2022 走看看