struct结构体初始化3种方法
From:?http://blog.csdn.net/thdxs/article/details/8204118
struct是C中重要的ADT。但是在一般講C的書中,往往只介紹了struct的定義、順序初始化及位域。
為了方便后面的介紹,先定義一個struct類型:
struct User
{
int id; //id
char name[100]; //user name
char *home; //home directory
int passwd; //password
};
1 初始化
struct數據有3中初始化方法:順序,C風格及C++風格的亂序。
1)順序
這種方法很常見,在一般的介紹C的書中都有介紹。順序初始化的特點是: 按照成員定義的順序,從前到后逐個初始化;允許只初始化部分成員;在被初始化的成員之前,不能有未初始化的成員。
eg:
struct User oneUser = {10, "Lucy","/home/Lucy"};
初始化之后,oneUser各個成員的值為:
oneUser.id = 10;
oneUser.name = "Lucy";
oneUser.home = "/home/Lucy";
oneUser.passwd = 0;
2)亂序(C風格)
順序的缺陷是必須按成員定義的順序逐個初始化,不能間隔。而亂序的方式則很好的解決了這個問題,因為這種方式是按照成員名進行。
eg:
struct User oneUser = {
.name = "Lucy",
.id = 10,
.home = "/home/Lucy"
};
3)亂序(C++風格)
C++風格的亂序初始化方式跟C風格的一樣,只是它更常用在C++代碼里。
eg:
struct User oneUser = {
name:"Lucy",
id:10,
home:"/home/Lucy"
};
不論是哪種方式,都允許只初始化部分成員;未被初始化的成員默認為0(指針類型的成員默認為NULL)。兩種亂序初始化方法,即可以用在C代碼中,也可以用在C++代碼中。
----------------------------------------------------------------------------------------------------------------------------
以下為自己的測試代碼
// 環境: centos7.2, g++ v4.8.5#include <iostream> #include <stdio.h> #include <string> #include <vector> #include "user.h"using namespace std;struct Person {int id;string name;int age; };void test(vector<Person>& v) {for(int i = 1; i < 6; i++){//Person p = {i, "hello", i * 11}; // 按順序賦值//Person p = {i, "hello"}; // 未賦值的以默認方式賦值//Person p = { .id = i, .name = "hello", .age = i * 11 }; // 按名字賦值(與定義順序一致)Person p = { id: i, name: "hello", age: i * 11 }; // 按名字賦值(與定義順序一致)//Person p = { .id = i, .age = i * 11, .name = "hello" }; // 按名字賦值(與定義順序不一致): 不平凡的代理初始值設定不受支持//Person p = { id : i, age : i * 11, name : "hello" }; // 按名字賦值(與定義順序不一致): 不平凡的代理初始值設定不受支持//Person* p = new Person {i, "hello", i * 11};v.push_back(p);} }int main() {vector<Person> v;test(v);cout << v.size() << endl;for(auto& i : v){printf("%d, %s, %d\n", i.id, i.name.c_str(), i.age);}return 0; }
總結
以上是生活随笔為你收集整理的struct结构体初始化3种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 爬虫进阶五之多线程的用法
- 下一篇: MATLAB卷积动画演示