C++中的结构体

技术交流QQ群:1027579432,欢迎你的加入!

1.Cpp中的结构体

  • C/C++数组允许定义可存储相同类型数据项的变量,但是结构体是C++中另一种用户自定义的可用的数据类型,它允许存储不同类型的数据项。结构体用于表示一条记录,假设想要跟踪图书馆中书本的状态,可能需要跟踪每本书的下列属性:
        Title: 标题
        Author: 作者
        Subject: 类别
        Book ID: 书的ID
    

2.定义结构体

  • 为了定义结构体,必须使用struct语句。struct语句定义了一个包含多个成员的新的数据类型!struct语句的格式如下:
        struct 结构体类型的名字{
            成员1类型 成员1的名字;
            成员2类型 成员2的名字;
            ...
            成员n类型 成员n的名字;
        }结构体变量名;
    
  • 在结构体定义的末尾,最后一个分号之前,可以指定一个或多个结构变量,这是可选的。实例如下:
        struct Book{  // Book是结构体类型名
            char title[50];
            char author[50];
            char subject[100];
            int book_id;
        }book; // book是变量名
    

3.访问结构体成员

  • 为了访问结构体的成员,使用成员访问运算符'.',成员访问运算符是结构体变量名称和要访问的结构体成员之间的一个点号,见具体的实例:
        Books book1;   // 定义结构体类型Books的变量book1
        Books book2;   // 定义结构体类型Books的变量book2
        // book1详细介绍
        strcpy(book1.title, "C++教程");
        strcpy(book1.author, "菜鸟教程");
        strcpy(book1.subject, "编程语言");
        book1.book_id = 123;
        // 输出book1的详细信息
        cout << "book1的标题: " << book1.title << endl;
        cout << "book1的作者: " << book1.author << endl;
        cout << "book1的类别: " << book1.subject << endl;
        cout << "book1的id: " << book1.book_id << endl;
        cout << "----------------------------------------------------\n";
        // book2详细介绍
        strcpy(book2.title, "白夜行");
        strcpy(book2.author, "东野圭吾");
        strcpy(book2.subject, "文学");
        book2.book_id = 666;
        // 输出book2的详细信息
        cout << "book2的标题: " << book2.title << endl;
        cout << "book2的作者: " << book2.author << endl;
        cout << "book2的类别: " << book2.subject << endl;
        cout << "book2的id: " << book2.book_id << endl;
    

4.结构体作为函数参数

  • 把结构体作为函数的参数,传递参数的方式与其他类型的变量或指针类型,具体见下面的实例:
        // 结构体作为函数参数
        void print_book_info(struct Books book){
        cout << "书的标题: " << book.title << endl; 
        cout << "书的作者: " << book.author << endl;
        cout << "书的类别: " << book.subject << endl;
        cout << "书的id: " << book.book_id << endl;
        }
        print_book_info(book1);
        cout << "----------------------------------------------------\n";   
        print_book_info(book2);
    

5.指向结构体的指针

  • 定义指向结构体的指针,方式与定义指向其他类型变量的指针类型:
        struct Books *struct_pointer;
    
  • 在上述定义的指针变量中存储结构体变量的地址,为了查找结构体变量的地址,把&运算符放在结构体名称的前面:
        struct_pointer = &book1;
    
  • 为了使用指向该结构体的指针来访问结构体的成员,必须使用箭头->运算符:
        struct_pointer->title;
    
  • 具体见下面的实例:
        // 指向结构体的指针,下面的函数以结构体指针作为函数形参
            void print_book_info_with_pointer(struct Books *book_pointer){
            cout << "书的标题: " << book_pointer->title << endl; 
            cout << "书的作者: " << book_pointer->author << endl;
            cout << "书的类别: " << book_pointer->subject << endl;
            cout << "书的id: " << book_pointer->book_id << endl;
        }
         // 指向结构体的指针
        print_book_info_with_pointer(&book1);  // 通过传book1的地址来输出book1信息
        cout << "----------------------------------------------------\n";   
        print_book_info_with_pointer(&book2);  // 通过传book2的地址来输出book2信息
    

6.typedef关键字

  • 下面是一种更简单的定义结构体的方式,可以为创建的类型取一个"别名",实例如下:
        // 使用typedef创建结构体
        typedef struct Book_Info{
            char title[50];
            char author[50];
            char subject[100];
            int book_id;
        }Book_Info;
    
  • 可以直接使用Book_Info来定义Book_Info类型的变量,而不需要使用struct关键字,如下面的实例:
        Book_Info book1_info, book2_info;
    
  • 可以使用typedef关键字来定义非结构类型,如下面的实例:
        typedef long int *pint32;
        pint32 x, y, z;  // x,y,z都是指向长整型long int的指针
    

7.结构体知识点总结

  • 结构体和C++中只有三点区别,除此之外无任何区别:
    • class中默认的成员访问权限是private的,而struct中则是public的
    • 从class继承默认是private继承的,而从struct继承默认是piblic继承的
    • class可以定义模板,而struct不可以
  • C++中的结构体关键字typedef可以直接省略,甚至不省略的话,还会提示你省略;原因:C语言的 struct 定义了一组变量的集合,C编译器并不认为这是一种新的类型;C++中的struct是一个新类型的定义声明, 所以可以省略typedef, 定义变量的时候也可以省略struct, 而不用像C语言那样没使用typedef取新名字时, 就需要用"struct 结构体名"这种形式定义变量。
  • 如果在结构体能够完成的目的的情况下,就没必要使用类;C与C++结构体中,前者不能有函数,后者可以有。
  • .与->运算符区别:访问结构的成员时使用点运算符,而通过指针访问结构的成员时,则使用箭头运算符。也就是说,用结构体定义了一个实体,那么这个实体要引用他里面的成员,就用 . 操作符,如果用结构体定义的是一个结构指针,那么要引用他里面的成员就用->。
        struct Employee{
            char name[50];
            int age;
            char address[50];
        }emp;
    
  • 点运算符.使用如下:
        strcpy(emp.name, "Curry_Coder");
    
  • 如果p_emp是一个指针,指向数据类型为Employee的对象,则要把值zara赋值给对象emp的name,需要使用箭头运算符->,箭头运算符->使用如下:
        strcpy(p_emp->name, "zara");
    

8.结构体的继承

  • C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。struct能包含成员函数;struct能继承;struct能实现多态;与class的区别是:最本质的一个区别就是默认的访问控制,体现在两个方面:
    • 默认的继承访问权限:struct是public的,class是private的;
          struct A{
              char a;
          };
          struct B:A{
              char b;
          };
      
      • 这个时候B是public继承A的,如果都将上面的struct改成class,那么B是private继承A的,这就是默认的继承访问权限。所以我们在平时写类继承的时候,通常会这样写:
            struct B: public A;
        
      • 就是为了指明是public继承,而不是用默认的private继承;到底默认是public继承还是private继承,取决于子类而不是基类;struct可以继承class,同样class也可以继承struct,那么默认的继承访问权限是看子类到底是用的struct还是class。如下:
            struct A{};
            class B: A{};  // private继承
            struct C: B{}; // public继承
        
    • struct作为数据结构的实现体,它默认的数据访问控制是public的。而class作为对象的实现体,它默认的成员变量访问控制是 private的。当你觉得你要做的更像是一种数据结构的话,那么用struct,如果你要做的更像是一种对象的话,那么用class。
          struct A //定义一个struct
          {
              char c1;
              int n2;
              double db3;
          };
          A a={'p',7,3.1415926}; //定义时直接赋值 
      
      • 向上面的struct中加入一个构造函数(或虚函数),struct也不能用{}赋初值了。原因:加入一个构造函数或是一个虚函数会使 struct更体现出一种对象的特性,而使此{}操作不再有效。事实上,是因为加入这样的函数,使得类的内部结构发生了变化。而加入一个普通的成员函数呢?你会发现{}依旧可用。其实你可以将普通的函数理解成对数据结构的一种算法,这并不打破它数据结构的特性。

9.参考博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352