2012-08-16 36 views
7

Nói rằng tôi có lớp học này:Các nhà thầu mặc định có được gọi tự động cho các biến thành viên không?

//Awesome.h 
class Awesome 
{ 
    public: 
     Awesome(); 
    private: 
     membertype member; 
} 

//Awesome.cpp 
#include "Awesome.h" 

Awesome::Awesome() 
:member() 
{ 
} 

Nếu tôi bỏ qua member() trong danh sách khởi tạo của các nhà xây dựng của Awesome, sẽ constructor của member được gọi tự động? Và nó chỉ được gọi khi tôi không bao gồm member trong danh sách khởi tạo?

+0

có thể trùng lặp với [Giá trị mặc định cho thành viên lớp C++] là gì (http://stackoverflow.com/questions/2614809/what-is-the-default-value-for-c-class-members) – FailedDev

+0

phụ thuộc vào 'membertype' nhưng thường là có. – AJG85

Trả lời

7

Từ § 8,5

Nếu không khởi tạo được quy định cho một đối tượng, đối tượng là mặc định khởi tạo; nếu không có khởi tạo nào được thực hiện, một đối tượng có thời lượng lưu trữ tự động hoặc động là có giá trị không xác định. [Lưu ý: đối tượng có thời lượng lưu trữ tĩnh hoặc luồng không được khởi tạo, xem 3.6.2. lưu ý end]

Cập nhật tài liệu tham khảo trong tương lai: thêm ý nghĩa của mặc định khởi tạo được định nghĩa là

Để mặc định khởi tạo một đối tượng kiểu T có nghĩa là:
-nếu T là một Loại lớp (có thể cv đủ điều kiện) (Điều 9), hàm khởi tạo mặc định cho T được gọi (và khởi tạo không thành hình nếu T không có hàm tạo mặc định có thể truy cập);
- nếu T là một loại mảng, mỗi thành phần được khởi tạo mặc định;
- nếu không, không khởi tạo được được thực hiện.
Nếu một chương trình yêu cầu khởi tạo mặc định là đối tượng của loại T đủ điều kiện const, T phải là loại lớp với một hàm tạo mặc định do người dùng cung cấp là .

Hơn nữa nó thay đổi từ giá trị khởi tạo ám này: -

Để 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) kiểu lớp (Khoản 9) với một nhà xây dựng 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 không đúng định dạng nếu T không có hàm khởi tạo mặc định là );
- nếu T là loại không thuộc loại công đoà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 được 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ỏ được gọi là.
- nếu T là mảng , thì mỗi phần tử được khởi tạo giá trị;
- nếu không, đối tượng không được khởi tạo.

13

Có. Khi một biến không được đưa ra trong danh sách initalizer, sau đó nó được mặc định được xây dựng tự động.

Mặc định contruction phương tiện, rằng nếu membertype là một class hoặc struct, sau đó nó sẽ được mặc định contructed, nếu đó là một mảng built-in, sau đó mỗi phần tử sẽ được mặc định được xây dựng và nếu đó là một build-in loại, sau đó không khởi tạo sẽ được thực hiện (trừ khi đối tượng Awesome có thời lượng lưu trữ tĩnh hoặc luồng cục bộ). Trường hợp cuối cùng có nghĩa là biến thành viên có thể (và thường sẽ) chứa rác không thể đoán trước trong trường hợp đối tượng Awesome được tạo trên ngăn xếp hoặc được cấp phát trên heap.

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