2013-01-10 82 views
14

Tôi chỉ mới học được ngày hôm qua rằng việc chỉ định tham số cho các mục danh sách khởi tạo là tùy chọn. Tuy nhiên, các quy tắc cho những gì xảy ra trong trường hợp này là gì?Giá trị mặc định trong danh sách khởi tạo C++

Trong ví dụ dưới đây, ptr sẽ được khởi tạo thành 0, chuyển thành false và Thanh được tạo mặc định? Tôi đoán câu hỏi này là loại dư thừa, bởi vì sẽ có ít điểm trong danh sách initializer nếu giá trị đối số không xác định == hành vi undefined.

Tôi cũng có thể được trỏ đến phần của tiêu chuẩn C++ nêu rõ hành vi trong trường hợp các mục danh sách khởi tạo không được đưa ra đối số không?

class Bar 
{ 
    Bar() { } 
}; 

class SomeClass; 
class AnotherClass 
{ 
public: 
    SomeClass *ptr; 
    bool toggle; 
    Bar bar; 

    AnotherClass() : ptr(), toggle(), bar() { } 
    // as opposed to... 
    // AnotherClass() : ptr(NULL), toggle(false), bar(Bar()) { } 
}; 
+0

Bản sao có thể có của [Danh sách khởi tạo constructor với khởi tạo trống] (https://stackoverflow.com/questions/11164394/constructor-initialization-list-with-empty-initialization) – Justin

Trả lời

12

Có, các thành viên sẽ được khởi tạo thành 0 và đối tượng được tạo mặc định tương ứng.

C++ 11 tiêu chuẩn quy định cụ thể hành vi này trong 12.6.2/7:

Khái niệm-list hoặc chuẩn bị tinh thần-init-list trong một mem-initializer được sử dụng để khởi tạo subobject định (hoặc, trong trường hợp của hàm tạo ủy nhiệm, đối tượng lớp hoàn chỉnh) theo các quy tắc khởi tạo 8.5 để khởi tạo trực tiếp.

Đổi lại, 8,5/10 lần đọc:

Một đối tượng có initializer là một tập rỗng của dấu ngoặc đơn, ví dụ:(), được giá trị khởi tạo.

Đoạn 8,5/7 định nghĩa giá trị khởi tạo:

Để giá trị khởi tạo một đối tượng kiểu T có nghĩa là:

  • nếu T là một (có thể cv-đủ điều kiện) loại lớp (Điều 9) với một hàm tạo do người dùng cung cấp (12.1), sau đó hàm khởi tạo mặc định cho T được gọi (và khởi tạo bị lỗi nếu T không có truy cập mặc định constructor);
  • nếu T là loại nhóm không công đoàn (có thể cv đủ điều kiện) không có người xây dựng do người dùng cung cấp, thì đối tượng là không khởi tạo và, nếu hàm tạo mặc định được khai báo ngầm của T là không nhỏ constructor được gọi.
  • nếu T là loại mảng, thì mỗi phần tử được khởi tạo giá trị;
  • nếu không, đối tượng là không được khởi tạo.

Và cuối cùng, 8,5/5 định nghĩa zero-khởi:

Để zero-khởi tạo một đối tượng hoặc tài liệu tham khảo của loại T có nghĩa là:

  • nếu T là một loại vô hướng (3.9), đối tượng được đặt thành giá trị 0 (không), được lấy làm biểu thức hằng số không thể tách rời, được chuyển thành T;
  • nếu T là loại (có thể cv đủ điều kiện) không phải công đoàn, mỗi dữ liệu không tĩnh thành viên và mỗi lớp con cấp cơ sở không được khởi tạo và đệm được khởi tạo thành 0 bit;
  • nếu T là một liên minh (có thể cv đủ điều kiện) , thành phần dữ liệu không được đặt tên đầu tiên của đối tượng là zero- khởi tạo và đệm được khởi tạo thành 0 bit;
  • nếu T là một loại mảng , mỗi phần tử không được khởi tạo;
  • nếu T là tham chiếu loại, không khởi tạo được thực hiện.
+0

Tuyệt vời và chi tiết. Chỉ là những gì tôi đang tìm kiếm - cảm ơn! –

2

Initialisations được bảo hiểm trong [dcl.init] (aka 8,5)

Point 10 nói:

Một đối tượng có initializer là một tập rỗng của dấu ngoặc đơn, tức là,(), sẽ được khởi tạo giá trị.

giá trị khởi được, đặt đơn giản, xây dựng mặc định cho các lớp học và zero-khởi động với nhiều loại phi lớp.

6

Trong ví dụ dưới đây, sẽ PTR được khởi tạo bằng 0, chuyển đổi false, và Bar mặc định-xây dựng?

Có. Nếu trình khởi tạo thành viên xuất hiện trong danh sách khởi tạo với dấu ngoặc đơn trống, thì thành viên đó là giá trị được khởi tạo. Điều này có nghĩa là các kiểu số sẽ được khởi tạo bằng không, các con trỏ tới null và các lớp với các hàm tạo mặc định bằng cách sử dụng hàm tạo đó.

Nếu bạn không bao gồm thành viên trong danh sách trình khởi tạo, thì thay vào đó, nó sẽ là mặc định được khởi tạo; trong trường hợp đó. các kiểu số và kiểu con trỏ sẽ không được khởi tạo.

Tôi cũng có thể được trỏ đến phần của tiêu chuẩn C++ nêu rõ hành vi trong trường hợp các mục danh sách khởi tạo không được đưa ra đối số không?

C++ 11 12.6.2/7 quy định rằng các quy tắc giống như quy tắc khởi tạo trực tiếp.

C++ 11 8.5/16 chỉ định rằng nếu trình khởi tạo là (), đối tượng được khởi tạo giá trị.

C++ 11 8.5/7 xác định giá trị khởi tạo.

Các vấn đề liên quan