2010-09-12 42 views
7

Trong C# Tôi biết bạn có thể sử dụng default keyword để gán các giá trị mặc định là 0 cho các kiểu giá trị và null cho các kiểu tham chiếu và các kiểu cấu trúc riêng lẻ được gán cho phù hợp. Theo hiểu biết của tôi thì không có giá trị mặc định trong C++. Bạn sẽ sử dụng phương pháp nào để có cùng chức năng như từ khóa mặc định cho Generics trong khi lập trình bằng C++?Từ khóa mặc định của C# tương đương trong C++?

Trả lời

11

Giả sử loại là cấu hình mặc định, bạn có thể sử dụng khởi tạo giá trị. Ví dụ:

template <typename T> 
T get() 
{ 
    return T(); // returns a value-initialized object of type T 
} 

Nếu loại không được cấu hình mặc định, thông thường bạn cần cung cấp mặc định để sử dụng. Ví dụ:

template <typename T> 
T get(const T& default_value = T()) 
{ 
    return default_value; 
} 

Chức năng này có thể được gọi là không có đối số nếu loại có thể cấu hình mặc định. Đối với các loại khác, bạn có thể cung cấp một giá trị được trả về.

0

Sử dụng một constructor mặc định, nó được sử dụng ngay cả khi bạn rời khỏi () ở cuối:

#include <iostream> 
class MyClass { 
    public: 
    int x; 
    MyClass(){ 
     x = 5; 
    } 
}; 

int main(){ 
    MyClass y; 
    std::cout << y.x; 
} 
0

Trong C++, gán một giá trị mặc định cho một biến trong phạm vi toàn cầu hoặc trong một chức năng đơn giản như :

int myint=2; 
float* pfloat=NULL; 

Đối với các thành viên lớp, bạn cần phải khởi tạo này trong constructor của lớp:

class myclass { 
private: 
    int i; 
public: 
    myclass() { 
    i = 4; 
    } 
}; 

Tôi không chắc về cấu trúc.

+2

cấu trúc và lớp học giống hệt nhau trong C++ ngoại trừ cho khả năng hiển thị mặc định của họ. –

2

C++ không có từ khóa default, bởi vì từ khóa không có sự khác biệt giữa loại tham chiếu và giá trị. Trong C++, tất cả các kiểu C# sẽ xem xét các kiểu giá trị, và nếu chúng là cấu trúc mặc định (như các kiểu dựng sẵn, các cấu trúc POD và các kiểu lớp với các hàm tạo mặc định), chúng được khởi tạo bằng cách khởi tạo giá trị (cú pháp hàm dựng mặc định) , như James McNellis cho thấy: (và không biết xấu hổ sao chép ở đây)

template <typename T> 
T get() 
{ 
    return T(); // returns a value-initialized object of type T 
} 

nếu T có một constructor mặc định, nó được gọi. Nếu nó không có các hàm tạo, mọi thứ được khởi tạo bằng không/null.

Và nếu loại không được định cấu hình mặc định, thì không có giá trị mặc định mà đối tượng có thể được cung cấp.

0

Dưới đây là tóm tắt nhanh về các kỹ thuật khởi tạo trong C++ 03.

Để không khởi tạo đối tượng kiểu 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 chuyển thành T;

— if T is a non-union class type, each nonstatic data member and each base-class subobject is zeroinitialized; 

— if T is a union type, the object’s first named data member89) is zero-initialized; 

— if T is an array type, each element is zero-initialized; 

— if T is a reference type, no initialization is performed. 

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

— if T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor); 

— if T is an array type, each element is default-initialized; 

— otherwise, the object is zero-initialized. 

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

— if T is a class type (clause 9) with a user-declared constructor (12.1), then the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor); 

— if T is a non-union class type without a user-declared constructor, then every non-static data member and base-class component of T is value-initialized; 

— if T is an array type, then each element is value-initialized; 

— otherwise, the object is zero-initialized 

Với sự hiểu biết rằng

struct S{ 
    int x; 
    S():x(1){} 
}; 

S sg;     // Every object of static storage duration is zero initialized at program startup before any other initialization takes place. So 'x' is initialized to 0, before the default constructor runs and sets 'x' to 1. 

int main{ 
    int x = int();  // value initialization syntax, as per rules above is initialized to 0. 

    S sl;    // default initialized 
} 
0

Trong C++, bạn thường gọi mặc định constructor (các nhà xây dựng có thể được gọi mà không có đối số). Điều này cũng phù hợp với các kiểu nguyên thủy (tức là, int() là 0, int*() là con trỏ rỗng, v.v.).

Ví dụ, trong chức năng mẫu của bạn, bạn muốn viết một cái gì đó như:

template<typename T> 
T foo() 
{ 
    T x = T(); // See notes below about this. 

    // Do other stuff. 

    return x; 
} 

Lưu ý rằng T x; bởi chính nó sẽ là đủ để mặc nhiên gọi một constructor mặc định cho phi POD loại, nhưng wouldn rằng' t làm việc cho các loại vô hướng nguyên thủy (chẳng hạn như int) nơi nó sẽ được khởi tạo vào thùng rác. (T x() cũng sẽ không hoạt động; that would be interpreted as a function declaration.)

0

Đây là câu hỏi hay. Các pletora của C++ loại biến thể làm cho văn bản mẫu an toàn của các loại như dưới đây một nỗi đau.

template <typename T> struct FrameworkTemplate { 
T mInstance; 
}; 

Hãy xem xét rằng, về mặt lý thuyết, người dùng có thể nhanh chóng mẫu lớp học của bạn như

// assume A is a known default constructible type 
FrameworkTemplate<A> 
FrameworkTemplate<const A> 
FrameworkTemplate<A const *> 
FrameworkTemplate<A const &> // and so on 

nơi cuối cùng ba không mặc constructible, mặc dù A có thể được. Đó là lý do tại sao các loại chung hữu ích như any, nullable, lazy và cứ như vậy, mặc dù đơn giản và trực quan ngay từ cái nhìn đầu tiên, không tầm thường để thực hiện (an toàn) trong C++ ...

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