zoukankan      html  css  js  c++  java
  • 结构体声明的方式 及类namespace的前置声明

    前置声明一般用于要在一个类中使用另一个类,而另一个类的声明在后面或者其他文件中时

    如类A和B

    class A{

    private:

          B *b;

    };

    class B{

    };这里类B在类A后面,但是类A中创建类B的指针了,所以要在类A前声明类B,将上面改成

    class B;

    class A{

    private:

          B *b;

    };

    class B{

    };虽然这里声明了在类A前面声明了类B,但是并不能在类A中创建类B的对象或者使用类B的方法

    namespace就是命名空间,可以在其中定义变量和函数等等

    #include<iostream>

    using namespace std;

    namespace A{

    void Print();

    void A::Print(){

    cout<<"From namespace A"<<endl;

    }

    namespace B{

    String a="From namespace B";

    void Print(){

    cout<<a<<endl;

    }

    }

    using namespace B;

    int main()

    {

    Print(); 

    A::Print();

    Print();

    return 0;

    }

    上面这段程序的运行结果应该是输出

    From namespace B

    From namespace A

    From namespace B

    主函数中第一个Print运行的是namespace B中的函数Print,因为在主函数之前有一条语句using namespace B;,这里表明了使用命名空间B,所以直接调用Print函数就是B中的,后面A::Print()则是直接使用域作用符::来访问namespace A中的Print函数,而在这后面又直接访问Print函数,因为域作用符只是本次有效,故第三个Print函数调用是直接访问了namspace B中的Print函数。

    假若在第三个Print函数和return 0之间加入

    using namespace A;

    Print();

    那么就会报错call of overloaded 'Print()' is ambiguous| 

    那是因为这里的using namespace A;虽然使用了A命名空间,但是实际上并不会在后面屏蔽B命名空间,所以调用Print函数就会不清楚调用的A中的还是B中的

    namespacens

    {

    ………//将内容添加到命名空间中

    }

    using namespace ns;

    ……..//声明命名空间后,表示ns命名空间里面的内容对于这条声明后的代码是可见的。

    但是如果声明了两个命名空间ns1,ns2。且ns1和ns2中包含相同的全局变量,或函数或类,那么就可能会产生冲突。

    using namespace ns1;

    using namespace ns2;

    ………//若使用了ns1和ns2中相同部分会产生冲突。

    解决方法:指定命名空间。例:ns1::变量名

    结构体声明的几种方式

    1.先声明结构体类型,再定义结构体变量

    /*图书的结构体类型声明*/
    struct Book
    {
        char ISBN[20];	   //图书的ISBN码。
    	char name[50];   //图书名称。
    	float price;   //价格
    };
    /*结构体变量定义*/
    struct Book book1;   //book1 为结构体变量。
    
    • 2.声明结构体类型,同时定义结构体变量
    /*图书的结构体类型声明*/
    struct Book  
    {
    	char ISBN[20];	   //图书的ISBN码。
    	char name[50];   //图书名称。
    	float price;   //价格
    }book2;    // book2 为结构体变量
    /*再次定义一个结构体变量 book3 */
    struct Book book3;   //book3 为结构体变量。
    
    • 3.不声明结构体类型,直接定义结构体变量
    /*图书的结构体类型声明*/
    struct  
    {
    	char ISBN[20];	   //图书的ISBN码。
    	char name[50];   //图书名称。
    	float price;   //价格
    }book4;    // book4 为结构体变量
    //但这样声明结构体类型后,就不可再定义新的结构体变量了。
    
    • 4.使用typedef声明结构体类型,再定义结构体变量
    /*图书的结构体类型声明 typedef 方式一*/
    typedef struct Book  
    {
    	char ISBN[20];	   //图书的ISBN码。
    	char name[50];   //图书名称。
    	float price;   //价格
    }strBook;    // strBook为结构体类型
    
    /*定义一个结构体变量 */
    struct Book book5;   //book5 为结构体变量。
    strBook book6;  //book6 为结构体变量。
    
    /*图书的结构体类型声明 typedef 方式二 */
    typedef struct  
    {
    	char ISBN[20];	   //图书的ISBN码。
    	char name[50];   //图书名称。
    	float price;   //价格
    }strBook;    // strBook为结构体类型
    
    /*定义一个结构体变量 */
    strBook book6;  //book7 为结构体变量。

    在使用 typedef struct {…}strBook;声明结构体类型时需要注意的是和直接 struct Book {}book2; 的区别,strBook 是结构体类型,而book2是结构体变量。(第4中方式二第2的区别)。在实际编码过程中常见的方式是选用第4的方式二进行编程。

    类的声明 , 类和结构体的区别 , 内联函数

    #include<iostream>

    using namespace std;

    class A;//类的声明

    class B

    {

        private:

                 A *a;//必须是指针 ,不能为 A a;

    };

    class  A

    {

       private:

             B b;

    };

    int main()

    {}

    类和结构体区别:

    结构体默认public

    类默认是private

    在继承方式:结构体默认公有继承

                      类默认私有继承

    inline

    调用内联函数并没有执行函数的调用过程,只是把函数的代码嵌入到了程序的调用点 , 减少了函数的调用过程。

    一般把内联函数写在.h头文件中

  • 相关阅读:
    poll系统调用的内核态实现机制分析
    Tomcat与web程序结构与Http协议
    关于java的环境变量的一点总结
    我想成为大牛,第一队,不要单打独斗
    ubuntu12.04单卡server(mentohust认证)再加上交换机做路由软件共享上网
    写在程序猿的困惑(特别Java程序猿)入行一年,感觉我不知道接下来该怎么办才能不断进步的,寻求翼
    三大趋势在移动互联网发展
    031 二进制1的数量(keep it up, 看到这个问题,刚开始有点蒙)
    【Java】【Flume】Flume-NG阅读源代码AvroSink
    PHP中间uniqid在高并发重复问题
  • 原文地址:https://www.cnblogs.com/klb561/p/14102993.html
Copyright © 2011-2022 走看看