Chi phí C++ so với C++

Nó được xác định bởi , cung cấp sự ổn định trong nhiều thập kỷ và có một cộng đồng người dùng đông đảo và sôi nổi. Xem thêm Ngôn ngữ lập trình C++ và Phát triển ngôn ngữ trong và cho thế giới thực. C++ 1991-2006

Show

Xem thêm và C++ đã được phát minh

C ++ có phải là ngôn ngữ thực tế không?

Đúng

C++ là một công cụ thiết thực. , nhưng nó hữu ích

Trong thế giới của phần mềm công nghiệp, C++ được xem như một công cụ chủ đạo vững chắc, hoàn thiện. Nó có sự hỗ trợ rộng rãi của ngành khiến nó trở nên “tốt” từ một

C ++ có phải là một ngôn ngữ hoàn hảo không?

Không

C++ không được thiết kế để chứng minh một ngôn ngữ hoàn hảo trông như thế nào. Nó được thiết kế để trở thành một công cụ thiết thực để giải quyết các vấn đề trong thế giới thực. Nó có một vài nhược điểm, giống như tất cả các công cụ lập trình thực tế, nhưng nơi duy nhất thích hợp để tiếp tục loay hoay với thứ gì đó cho đến khi nó hoàn hảo là trong môi trường học thuật thuần túy. Đó không phải là mục tiêu của C++

Nguyên tắc không chi phí là gì?

Nguyên tắc zero-overhead là nguyên tắc định hướng cho việc thiết kế C++. Nó nói rằng. Những gì bạn không sử dụng, bạn không phải trả tiền (theo thời gian hoặc không gian) và hơn thế nữa. Những gì bạn sử dụng, bạn không thể viết tay tốt hơn

Nói cách khác, không nên thêm tính năng nào vào C++ để làm cho bất kỳ mã hiện có nào (không sử dụng tính năng mới) lớn hơn hoặc chậm hơn, cũng như không nên thêm bất kỳ tính năng nào mà trình biên dịch sẽ tạo ra mã không tốt như lập trình viên sẽ làm.

Điều gì tuyệt vời về các lớp học?

Các lớp học ở đó để giúp bạn tổ chức mã của mình và lý luận về các chương trình của bạn. Bạn có thể nói một cách đại khái rằng các lớp học ở đó để giúp bạn tránh mắc lỗi và giúp bạn tìm lỗi sau khi bạn mắc lỗi. Bằng cách này, các lớp giúp bảo trì đáng kể

Một lớp là sự thể hiện của một ý tưởng, một khái niệm, trong mã. Một đối tượng của một lớp đại diện cho một ví dụ cụ thể về ý tưởng trong mã. Nếu không có các lớp, người đọc mã sẽ phải đoán về mối quan hệ giữa các mục dữ liệu và hàm – các lớp làm cho các mối quan hệ đó trở nên rõ ràng và được “hiểu” bởi trình biên dịch. Với các lớp, nhiều cấu trúc cấp cao của chương trình của bạn được phản ánh trong mã, không chỉ trong các nhận xét

Một lớp được thiết kế tốt trình bày một giao diện rõ ràng và đơn giản cho người dùng, ẩn biểu diễn của nó và giúp người dùng không phải biết về biểu diễn đó. Nếu đại diện không nên bị ẩn - giả sử, bởi vì người dùng có thể thay đổi bất kỳ thành viên dữ liệu nào theo bất kỳ cách nào họ muốn - bạn có thể coi lớp đó là "chỉ là một cấu trúc dữ liệu cũ đơn giản";

struct Pair {
    Pair(const string& n, const string& v) : name(n), value(v) { }
    string name, value;
};

Lưu ý rằng ngay cả các cấu trúc dữ liệu cũng có thể được hưởng lợi từ các chức năng phụ trợ, chẳng hạn như hàm tạo. Khi thiết kế một lớp, sẽ rất hữu ích khi xem xét điều gì đúng với mọi đối tượng của lớp và tại mọi thời điểm. Tính chất như vậy được gọi là tính chất bất biến. Ví dụ, bất biến của

class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};
3 có thể là (a) biểu diễn của nó bao gồm một con trỏ tới một số phần tử và (b) số phần tử đó được lưu trữ trong một số nguyên. Công việc của mọi hàm tạo là thiết lập bất biến lớp, để mọi hàm thành viên có thể dựa vào nó. Mọi chức năng thành viên phải để giá trị bất biến khi thoát. Kiểu suy nghĩ này đặc biệt hữu ích cho các lớp quản lý tài nguyên như khóa, ổ cắm và tệp. Ví dụ, một lớp xử lý tệp sẽ có một bất biến là nó giữ một con trỏ tới một tệp đang mở. Hàm tạo xử lý tệp mở tệp. Trình hủy tài nguyên miễn phí có được bởi các nhà xây dựng. Ví dụ: hàm hủy cho một trình xử lý tệp sẽ đóng tệp được mở bởi hàm tạo

class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};

Nếu bạn chưa lập trình với các lớp, bạn sẽ thấy các phần của phần giải thích này khó hiểu và bạn sẽ đánh giá thấp tính hữu ích của các lớp. Tìm ví dụ. Giống như tất cả các sách giáo khoa tốt, TC++PL có rất nhiều ví dụ; . Hầu hết các thư viện C++ hiện đại bao gồm (trong số những thứ khác) các lớp và hướng dẫn thư viện là một trong những nơi tốt nhất để tìm ví dụ về các lớp hữu ích

Vấn đề lớn với OO là gì?

Các kỹ thuật hướng đối tượng sử dụng các lớp và hàm ảo là một cách quan trọng để phát triển các hệ thống và ứng dụng phần mềm lớn, phức tạp. cũng vậy. Cả hai đều là những cách quan trọng để thể hiện tính đa hình - tương ứng tại thời gian chạy và thời gian biên dịch. Và họ làm việc tuyệt vời cùng nhau trong C ++

Có rất nhiều định nghĩa về “hướng đối tượng”, “lập trình hướng đối tượng”, “ngôn ngữ lập trình hướng đối tượng”. Để biết giải thích dài dòng về những gì Stroustrup nghĩ là “hướng đối tượng”, hãy đọc Tại sao C++ không chỉ là một ngôn ngữ lập trình hướng đối tượng. Điều đó nói rằng, lập trình hướng đối tượng là một phong cách lập trình bắt nguồn từ Simula (khoảng 40 năm trước. ) dựa trên đóng gói, kế thừa và đa hình. Trong ngữ cảnh của C++ (và của nhiều ngôn ngữ khác có nguồn gốc từ Simula), điều đó có nghĩa là lập trình sử dụng hệ thống phân cấp lớp và các hàm ảo để cho phép thao tác với các đối tượng thuộc nhiều loại thông qua các giao diện được xác định rõ và cho phép mở rộng chương trình

Xem để biết ý tưởng về những điều tuyệt vời về “các lớp đơn giản”. Điểm của việc sắp xếp các lớp thành một hệ thống phân cấp lớp là thể hiện mối quan hệ thứ bậc giữa các lớp và sử dụng các mối quan hệ đó để đơn giản hóa mã

Để thực sự hiểu OOP, hãy tìm một số ví dụ. Ví dụ: bạn có thể có hai (hoặc nhiều) trình điều khiển thiết bị có giao diện chung

class Driver {  // common driver interface
public:
    virtual int read(char* p, int n) = 0; // read max n characters from device to p
                                          // return the number of characters read
    virtual bool reset() = 0;             // reset device
    virtual Status check() = 0;           // read status
};

class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};
4 này chỉ đơn giản là một giao diện. Nó được định nghĩa không có thành viên dữ liệu và một tập hợp các hàm ảo thuần túy. Một
class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};
4 có thể được sử dụng thông qua giao diện này và nhiều loại trình điều khiển khác nhau có thể triển khai giao diện này

class Driver1 : public Driver { // a driver
public:
    Driver1(Register);          // constructor
    int read(char*, int n) override;    
    bool reset() override;
    Status check() override;
private:
    // implementation details, including representation
};

class Driver2 : public Driver { // another driver
public:
    Driver2(Register);
    int read(char*, int n) override;    
    bool reset() override;
    Status check() override;
private:
    // implementation details, including representation
};

Lưu ý rằng các trình điều khiển này chứa dữ liệu (trạng thái) và các đối tượng của chúng có thể được tạo. Họ thực hiện các chức năng được xác định trong

class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};
4. Chúng ta có thể tưởng tượng một trình điều khiển được sử dụng như thế này

________số 8_______

Điểm mấu chốt ở đây là

class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};
7 không cần biết nó sử dụng loại trình điều khiển nào; . Chúng ta có thể gọi
class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};
7 như thế này

void g()
{
    Driver1 d1(Register(0xf00));  // create a Driver1 for device
                                  // with device register at address 0xf00

    Driver2 d2(Register(0xa00));  // create a Driver2 for device
                                  // with device register at address 0xa00
    // ...
    int dev;
    cin >> dev;

    if (dev==1) 
        f(d1);  // use d1
    else
        f(d2);  // use d2
    // ...
}

Lưu ý rằng khi

class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};
7 sử dụng
class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};
4, loại hoạt động phù hợp được chọn hoàn toàn trong thời gian chạy. Ví dụ: khi
class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};
7 được thông qua
class Driver {  // common driver interface
public:
    virtual int read(char* p, int n) = 0; // read max n characters from device to p
                                          // return the number of characters read
    virtual bool reset() = 0;             // reset device
    virtual Status check() = 0;           // read status
};
3,
class Driver {  // common driver interface
public:
    virtual int read(char* p, int n) = 0; // read max n characters from device to p
                                          // return the number of characters read
    virtual bool reset() = 0;             // reset device
    virtual Status check() = 0;           // read status
};
4 sử dụng
class Driver {  // common driver interface
public:
    virtual int read(char* p, int n) = 0; // read max n characters from device to p
                                          // return the number of characters read
    virtual bool reset() = 0;             // reset device
    virtual Status check() = 0;           // read status
};
5, trong khi khi
class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};
7 được thông qua
class Driver {  // common driver interface
public:
    virtual int read(char* p, int n) = 0; // read max n characters from device to p
                                          // return the number of characters read
    virtual bool reset() = 0;             // reset device
    virtual Status check() = 0;           // read status
};
7,
class Driver {  // common driver interface
public:
    virtual int read(char* p, int n) = 0; // read max n characters from device to p
                                          // return the number of characters read
    virtual bool reset() = 0;             // reset device
    virtual Status check() = 0;           // read status
};
4 sử dụng
class Driver {  // common driver interface
public:
    virtual int read(char* p, int n) = 0; // read max n characters from device to p
                                          // return the number of characters read
    virtual bool reset() = 0;             // reset device
    virtual Status check() = 0;           // read status
};
9. Điều này đôi khi được gọi là công văn thời gian chạy hoặc công văn động. Trong trường hợp này, không có cách nào mà
class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};
7 có thể biết loại thiết bị mà nó được gọi bởi vì chúng tôi chọn nó dựa trên đầu vào

Xin lưu ý rằng lập trình hướng đối tượng không phải là thuốc chữa bách bệnh. “OOP” không chỉ đơn giản có nghĩa là “tốt” - nếu không có mối quan hệ phân cấp vốn có giữa các khái niệm cơ bản trong vấn đề của bạn thì không có số lượng phân cấp và chức năng ảo nào sẽ cải thiện mã của bạn. Điểm mạnh của OOP là có nhiều vấn đề có thể được thể hiện một cách hữu ích bằng cách sử dụng hệ thống phân cấp lớp – điểm yếu chính của OOP là có quá nhiều người cố gắng ép quá nhiều vấn đề vào một khuôn mẫu phân cấp. Không phải mọi chương trình đều hướng đối tượng. Là các lựa chọn thay thế, hãy xem xét các hàm , , và độc lập (như trong toán học, C và Fortran)

Nếu bạn vẫn đang thắc mắc “tại sao lại là OO?”, hãy xem xét thêm các lý do kinh doanh

Ngành công nghiệp phần mềm đang thành công trong việc tự động hóa nhiều chức năng của cuộc sống từng là thủ công. Ngoài ra, phần mềm đang cải thiện tính linh hoạt của các thiết bị trước đây được tự động hóa, ví dụ, chuyển đổi cách triển khai nội bộ của nhiều thiết bị hiện có trước đây từ cơ học sang phần mềm (đồng hồ, hệ thống đánh lửa ô tô, v.v. ) hoặc từ việc điều khiển bằng mạch điện đến phần mềm (TV, thiết bị nhà bếp, v.v.). ). Và, tất nhiên, phần mềm được tích hợp vào mọi khía cạnh của cuộc sống kinh doanh hàng ngày của chúng ta — phần mềm ban đầu chỉ giới hạn ở Kế toán và Tài chính, nhưng giờ đây phần mềm được nhúng vào Hoạt động, Tiếp thị, Bán hàng và Quản lý — phần mềm gần như ở khắp mọi nơi

Thành công đáng kinh ngạc này đã liên tục nhấn mạnh khả năng của các tổ chức phát triển phần mềm để theo kịp. Là một ngành công nghiệp, phát triển phần mềm liên tục không đáp ứng được nhu cầu về các hệ thống phần mềm lớn, phức tạp. Vâng, sự thất bại này thực sự là do sự thành công của khả năng mang lại giá trị cảm nhận của phần mềm - nó thực sự gây ra bởi vì nhu cầu lớn hơn khả năng đáp ứng nhu cầu đó của chúng tôi. Và mặc dù chúng ta, những người làm phần mềm có thể ngồi xung quanh và tự vỗ lưng cho nhu cầu đó, nhưng các nhà đổi mới và các nhà lãnh đạo tư tưởng trong lĩnh vực này và mọi lĩnh vực khác được đánh dấu bởi một đặc điểm không thể phủ nhận. họ / chúng tôi không hài lòng. Là một ngành công nghiệp, chúng ta phải làm tốt hơn. tốt hơn rất nhiều. Uber tốt hơn

Những thành công trong quá khứ của chúng tôi đã thúc đẩy người dùng yêu cầu nhiều hơn. Chúng tôi đã tạo ra cơn đói thị trường mà các kỹ thuật Phân tích, Thiết kế và Lập trình có cấu trúc không thể đáp ứng được. Điều này yêu cầu chúng tôi tạo ra một mô hình tốt hơn. một số, trên thực tế

C++ hỗ trợ lập trình OO. C++ cũng có thể được sử dụng như một ngôn ngữ lập trình mệnh lệnh, truyền thống (“như một ngôn ngữ C tốt hơn”) hoặc sử dụng. Đương nhiên, mỗi cách tiếp cận này đều có ưu và nhược điểm của nó; . (Trường hợp hiểu lầm phổ biến nhất. đừng mong nhận được những lợi ích của lập trình hướng đối tượng nếu bạn đang sử dụng C++ như một ngôn ngữ C tốt hơn. )

C++ cũng hỗ trợ. Và gần đây nhất C++ đang bắt đầu hỗ trợ (trái ngược với việc chỉ cho phép) phương pháp lập trình chức năng. Các lập trình viên giỏi nhất có thể quyết định cách tiếp cận nào phù hợp nhất trong tình huống nào, thay vì cố gắng áp dụng một cách tiếp cận duy nhất (“cách tiếp cận yêu thích của tôi”) cho mọi vấn đề ở mọi nơi trong mọi ngành bất kể bối cảnh kinh doanh hay mục tiêu của nhà tài trợ.

Quan trọng nhất, đôi khi giải pháp tốt nhất đạt được bằng cách sử dụng kết hợp các tính năng từ các kiểu lập trình Hướng đối tượng, Chung và Chức năng, trong khi cố gắng hạn chế bản thân trong một cách tiếp cận cụ thể có thể dẫn đến một giải pháp dưới mức tối ưu

Vấn đề lớn với lập trình chung là gì?

Các kỹ thuật lập trình chung sử dụng các mẫu là một cách quan trọng để phát triển các hệ thống và ứng dụng phần mềm lớn, phức tạp. cũng vậy. Cả hai đều là những cách quan trọng để thể hiện tính đa hình - tương ứng tại thời điểm biên dịch và thời gian chạy. Và họ làm việc tuyệt vời cùng nhau trong C ++

C++ hỗ trợ lập trình chung. Lập trình chung là một cách phát triển phần mềm tối đa hóa việc sử dụng lại mã theo cách không làm giảm hiệu suất. (Phần “hiệu suất” không thực sự cần thiết, nhưng nó rất được mong đợi. )

Lập trình chung là lập trình dựa trên tham số hóa. Bạn có thể tham số hóa một loại với một loại khác (chẳng hạn như

class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};
3 với các loại phần tử của nó) và một thuật toán với một loại khác (chẳng hạn như hàm sắp xếp có hàm so sánh). Mục đích của lập trình chung là khái quát hóa một thuật toán hoặc cấu trúc dữ liệu hữu ích thành dạng tổng quát và hữu ích nhất của nó. Ví dụ, một
class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};
3 số nguyên là được và một hàm tìm giá trị lớn nhất trong một
class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};
3 số nguyên cũng vậy. Tuy nhiên, một hàm tìm kiếm chung tốt hơn sẽ có thể tìm thấy một phần tử trong một
class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};
3 thuộc bất kỳ loại nào hoặc tốt hơn nữa là trong bất kỳ chuỗi phần tử nào được mô tả bằng một cặp vòng lặp

auto p = find(begin(vs), end(vs), "Grail"s); // vector vs; p is vector::iterator 

auto q = find(begin(vi), end(vi), 42);       // vector vi;    q is vector::iterator 

auto r = find(begin(ld), end(ld), 1.2);      // list ld;   r is list::iterator 

auto s = find(begin(ar), end(ar), 10);       // int ar[10];        s is int *

Những ví dụ này là từ STL (phần chứa và thuật toán của thư viện chuẩn ISO C++);

Lập trình chung theo một số cách linh hoạt hơn lập trình hướng đối tượng. Đặc biệt, nó không phụ thuộc vào thứ bậc. Ví dụ: không có mối quan hệ thứ bậc giữa

class Driver1 : public Driver { // a driver
public:
    Driver1(Register);          // constructor
    int read(char*, int n) override;    
    bool reset() override;
    Status check() override;
private:
    // implementation details, including representation
};

class Driver2 : public Driver { // another driver
public:
    Driver2(Register);
    int read(char*, int n) override;    
    bool reset() override;
    Status check() override;
private:
    // implementation details, including representation
};
5 và
class Driver1 : public Driver { // a driver
public:
    Driver1(Register);          // constructor
    int read(char*, int n) override;    
    bool reset() override;
    Status check() override;
private:
    // implementation details, including representation
};

class Driver2 : public Driver { // another driver
public:
    Driver2(Register);
    int read(char*, int n) override;    
    bool reset() override;
    Status check() override;
private:
    // implementation details, including representation
};
6. Lập trình chung thường có cấu trúc hơn OOP; . Trong ngữ cảnh của C++, lập trình chung giải quyết tất cả các tên tại thời điểm biên dịch; . Điều này đã khiến lập trình chung trở nên thống trị trong các lĩnh vực mà hiệu suất thời gian chạy là quan trọng

Xin lưu ý rằng lập trình chung không phải là thuốc chữa bách bệnh. Có nhiều phần của chương trình không cần tham số hóa và nhiều ví dụ trong đó công văn thời gian chạy (OOP) phù hợp hơn

Các thành phần chung khá dễ sử dụng, ít nhất là nếu chúng được thiết kế tốt và chúng có xu hướng che giấu rất nhiều sự phức tạp. Một tính năng thú vị khác là chúng có xu hướng làm cho mã của bạn nhanh hơn, đặc biệt nếu bạn sử dụng chúng nhiều hơn. Điều này tạo ra một sự không đánh đổi dễ chịu. khi bạn sử dụng các thành phần để thực hiện công việc khó chịu cho mình, mã của bạn sẽ nhỏ hơn và đơn giản hơn, bạn ít có khả năng gây ra lỗi hơn và mã của bạn sẽ thường chạy nhanh hơn

Hầu hết các nhà phát triển không sẵn sàng tạo ra các thành phần chung này, nhưng hầu hết đều có thể sử dụng chúng. May mắn thay, các thành phần chung là, ừm, chung chung, vì vậy tổ chức của bạn thường không cần phải tạo nhiều chúng. Có rất nhiều thư viện sẵn có của các thành phần chung. là một trong những thư viện như vậy. Boost có nhiều hơn nữa

Lập trình đa mô hình là gì?

Nói ngắn gọn. Giống như chỉ “lập trình”, sử dụng các tính năng khác nhau (đáng chú ý là hướng đối tượng và kiểu chung) kết hợp khi cần

Quay lại khi việc lập trình OO và chung trong cùng một ngôn ngữ vẫn còn mới, “lập trình đa mô hình” ban đầu là một cách nói hoa mỹ để nói “lập trình sử dụng nhiều hơn một phong cách lập trình, mỗi phong cách đều có hiệu quả tốt nhất. ” Ví dụ: sử dụng lập trình hướng đối tượng khi cần có độ phân giải thời gian chạy giữa các loại đối tượng khác nhau và lập trình chung khi an toàn kiểu tĩnh và hiệu suất thời gian chạy ở mức cao. Đương nhiên, sức mạnh chính của lập trình đa mô hình là trong các chương trình sử dụng nhiều hơn một mô hình (kiểu lập trình), do đó sẽ khó có được hiệu quả tương tự bằng cách soạn một hệ thống từ các phần được viết bằng các ngôn ngữ hỗ trợ các mô hình khác nhau. Các trường hợp hấp dẫn nhất đối với lập trình đa mô hình được tìm thấy khi các kỹ thuật từ các mô hình khác nhau được sử dụng trong sự cộng tác chặt chẽ để viết mã thanh lịch hơn và dễ bảo trì hơn so với khả năng có thể trong một mô hình duy nhất. Một ví dụ đơn giản là truyền tải một vùng chứa các đối tượng được nhập tĩnh của loại đa hình

void draw_all(vector& vs)   // draw each element of a standard vector
{
    for_each(vs.begin(),vs.end(),[](Shape* p){ p->draw(); });
}

Ở đây,

class Driver1 : public Driver { // a driver
public:
    Driver1(Register);          // constructor
    int read(char*, int n) override;    
    bool reset() override;
    Status check() override;
private:
    // implementation details, including representation
};

class Driver2 : public Driver { // another driver
public:
    Driver2(Register);
    int read(char*, int n) override;    
    bool reset() override;
    Status check() override;
private:
    // implementation details, including representation
};
7 sẽ là một lớp cơ sở trừu tượng xác định giao diện cho một hệ thống phân cấp các hình dạng hình học. Ví dụ này dễ dàng khái quát hóa cho bất kỳ bộ chứa thư viện tiêu chuẩn nào

template
void draw_all(C& cs)    // draw each element of a standard container
{
    for_each(cs.begin(),cs.end(),[](Shape* p){ p->draw(); });
}

Đây là lập trình có cấu trúc OOP, GP, chức năng hay thông thường? . Đó là mẫu hàm (GP) với phần thân thủ tục (cấu trúc thông thường) sử dụng thuật toán chung (lại là GP) và lambda (chức năng) đưa con trỏ đến lớp cơ sở và gọi hàm ảo (OO). Điểm mấu chốt là tất cả chỉ là “lập trình. ”

Vì vậy, ngày nay thay vì “lập trình đa mô hình”, chúng ta chỉ nên nói “lập trình. ” Tất cả chỉ là lập trình, chỉ cần sử dụng các tính năng phù hợp của ngôn ngữ kết hợp với nhau như bình thường

C ++ có tốt hơn Java không?

Dừng lại. Câu hỏi này tạo ra nhiều nhiệt hơn nhiều so với ánh sáng. Vui lòng đọc phần sau trước khi đăng một số biến thể của câu hỏi này

Trong 99% trường hợp, việc lựa chọn ngôn ngữ lập trình không phải do các cân nhắc kỹ thuật. Những thứ thực sự quan trọng là những thứ như tính khả dụng của môi trường lập trình cho máy phát triển, tính khả dụng của (các) môi trường thời gian chạy cho (các) máy triển khai, các vấn đề về giấy phép/pháp lý của thời gian chạy và/hoặc môi trường phát triển, tính khả dụng của các dịch vụ được đào tạo . Những cân nhắc kinh doanh này thường đóng một vai trò lớn hơn nhiều so với hiệu suất thời gian biên dịch, hiệu suất thời gian chạy, tĩnh so với. gõ động, tĩnh so với. liên kết động, v.v.

Những người bỏ qua (trội. ) tiêu chí kinh doanh khi đánh giá sự cân bằng ngôn ngữ lập trình khiến họ bị chỉ trích vì có phán đoán kém. Hãy kỹ thuật, nhưng đừng là một người sành điệu về công nghệ. và những người không nhận ra rằng điều đó đã được định sẵn để đưa ra những quyết định gây ra hậu quả kinh doanh khủng khiếp — họ rất nguy hiểm cho người chủ của họ

Các so sánh được lưu hành rộng rãi nhất có xu hướng là những so sánh được viết bởi những người ủng hộ một số ngôn ngữ, Z, để chứng minh rằng Z tốt hơn các ngôn ngữ khác. Với việc sử dụng rộng rãi, C++ thường đứng đầu danh sách các ngôn ngữ mà những người ủng hộ Z muốn chứng tỏ sự kém cỏi. Thông thường, những bài báo như vậy được “xuất bản” hoặc phân phối bởi một công ty bán Z như một phần của chiến dịch tiếp thị. Đáng ngạc nhiên, nhiều người dường như coi một bài báo chưa được đánh giá được viết bởi những người làm việc cho một công ty bán Z “chứng minh” rằng Z là tốt nhất một cách nghiêm túc. Một vấn đề là luôn có những hạt sự thật trong những so sánh như vậy. Rốt cuộc, không có ngôn ngữ nào tốt hơn ngôn ngữ nào theo mọi cách có thể. C ++ chắc chắn không hoàn hảo, nhưng sự thật có chọn lọc có thể quyến rũ nhất và đôi khi hoàn toàn sai lệch. Khi xem xét so sánh ngôn ngữ, hãy cân nhắc xem ai đã viết nó, xem xét cẩn thận xem các mô tả có thực tế và công bằng hay không, đồng thời liệu bản thân các tiêu chí so sánh có công bằng đối với tất cả các ngôn ngữ được xem xét hay không. Điều này không dễ dàng

Stroustrup từ chối so sánh C++ với các ngôn ngữ khác vì những lý do này được đưa ra trong Thiết kế và sự phát triển của C++

“Một số nhà phê bình yêu cầu tôi so sánh C++ với các ngôn ngữ khác. Điều này tôi đã quyết định không làm. Qua đó, tôi đã khẳng định lại một quan điểm lâu dài và vững chắc. So sánh ngôn ngữ hiếm khi có ý nghĩa và thậm chí ít công bằng hơn. Để so sánh tốt các ngôn ngữ lập trình chính đòi hỏi nhiều nỗ lực hơn hầu hết mọi người sẵn sàng bỏ ra, kinh nghiệm trong nhiều lĩnh vực ứng dụng, duy trì chặt chẽ quan điểm khách quan và vô tư, và cảm giác công bằng. Tôi không có thời gian, và với tư cách là người thiết kế C++, sự vô tư của tôi sẽ không bao giờ hoàn toàn đáng tin cậy

Tôi cũng lo lắng về một hiện tượng mà tôi đã nhiều lần quan sát thấy trong những nỗ lực trung thực trong việc so sánh ngôn ngữ. Các tác giả cố gắng hết sức để công bằng, nhưng thiên vị một cách vô vọng bằng cách tập trung vào một ứng dụng duy nhất, một phong cách lập trình duy nhất hoặc một nền văn hóa duy nhất giữa các lập trình viên. Tồi tệ hơn, khi một ngôn ngữ được biết đến nhiều hơn đáng kể so với những ngôn ngữ khác, một sự thay đổi nhỏ trong quan điểm xảy ra. Các lỗi trong ngôn ngữ nổi tiếng được coi là nhỏ và các cách giải quyết đơn giản được trình bày, trong khi các lỗi tương tự trong các ngôn ngữ khác được coi là cơ bản. Thông thường, những cách giải quyết thường được sử dụng trong các ngôn ngữ ít nổi tiếng hơn đơn giản là những người so sánh không biết hoặc được coi là không đạt yêu cầu vì chúng không thể thực hiện được trong ngôn ngữ quen thuộc hơn

Tương tự như vậy, thông tin về ngôn ngữ nổi tiếng có xu hướng được cập nhật hoàn toàn, trong khi đối với ngôn ngữ ít được biết đến, các tác giả dựa vào thông tin vài năm tuổi. Đối với các ngôn ngữ đáng để so sánh, hãy so sánh ngôn ngữ X được định nghĩa ba năm trước với. ngôn ngữ Y như nó xuất hiện trong triển khai thử nghiệm mới nhất không công bằng cũng như không mang tính thông tin. Vì vậy, tôi hạn chế nhận xét của mình về các ngôn ngữ khác ngoài C++ ở mức chung chung và các nhận xét rất cụ thể. ”

Điều đó nói rằng, C ++ được coi là sự lựa chọn tốt nhất trong ngôn ngữ lập trình cho nhiều người và ứng dụng

Tại sao C ++ lại lớn như vậy?

C++ không phải là một ngôn ngữ nhỏ được thiết kế để trở thành ngôn ngữ tối thiểu cho việc giảng dạy, nhưng cũng không phải là ngôn ngữ mà mọi người thường so sánh với nó, chẳng hạn như C, Java, C#. Họ cũng rất lớn so với Pascal như Dr. Wirth ban đầu đã định nghĩa nó – vì những lý do chính đáng. Thế giới lập trình ngày nay phức tạp hơn nhiều so với 30 năm trước và các ngôn ngữ lập trình hiện đại phản ánh điều đó

C++ không lớn như một số người tưởng tượng. Theo số lượng từ, kích thước của các đặc tả ngôn ngữ (không bao gồm các thư viện chuẩn) cho C++, C# và Java hiện cách nhau một vài điểm phần trăm. Điều này phản ánh rằng chúng là các ngôn ngữ chính có mục đích chung đã phát triển các tính năng tương tự – loại trừ

class Driver1 : public Driver { // a driver
public:
    Driver1(Register);          // constructor
    int read(char*, int n) override;    
    bool reset() override;
    Status check() override;
private:
    // implementation details, including representation
};

class Driver2 : public Driver { // another driver
public:
    Driver2(Register);
    int read(char*, int n) override;    
    bool reset() override;
    Status check() override;
private:
    // implementation details, including representation
};
8/
class Driver1 : public Driver { // a driver
public:
    Driver1(Register);          // constructor
    int read(char*, int n) override;    
    bool reset() override;
    Status check() override;
private:
    // implementation details, including representation
};

class Driver2 : public Driver { // another driver
public:
    Driver2(Register);
    int read(char*, int n) override;    
    bool reset() override;
    Status check() override;
private:
    // implementation details, including representation
};
9, phạm vi vòng lặp
void f(Driver& d)               // use driver
{
    Status old_status = d.check();  
    // ...
    d.reset();
    char buf[512];
    int x = d.read(buf,512);
    // ...
}
0, hàm lambda, các mức hỗ trợ khác nhau cho lập trình chung, v.v. Nó cũng phản ánh cái mà các nhà lý thuyết thiết kế gọi là “sự phức tạp thiết yếu trong miền vấn đề” – sự phức tạp trong thế giới thực và một ngôn ngữ nghiêm túc phải bộc lộ, mọi thứ từ sự khác biệt cơ bản của hệ điều hành đến việc gọi các thư viện C++

Trong một số trường hợp C++ hỗ trợ trực tiếp (i. e. , trong ngôn ngữ) mà một số ngôn ngữ khác hỗ trợ thông qua các thư viện, vì vậy phần ngôn ngữ sẽ tương đối lớn hơn. Mặt khác, nếu bạn muốn viết một “ứng dụng hiện đại điển hình”, bạn cần xem xét giao diện hệ điều hành, GUI, cơ sở dữ liệu, giao diện web, v.v. tổng các tính năng ngôn ngữ, thư viện, quy ước và tiêu chuẩn lập trình mà bạn phải làm quen với ngôn ngữ lập trình. Ở đây, kích thước của C++ có thể là một lợi thế khi nó hỗ trợ tốt hơn các thư viện tốt

Cuối cùng, thời đại mà một lập trình viên mới vào nghề có thể biết tất cả một ngôn ngữ đã không còn nữa, ít nhất là đối với các ngôn ngữ được sử dụng rộng rãi trong công nghiệp. Rất ít người biết “tất cả C” hoặc “tất cả Java” và không ai trong số họ là người mới. Theo đó, không ai cần phải xin lỗi vì thực tế là những người mới không biết tất cả về C ++. Những gì bạn phải làm - trong bất kỳ ngôn ngữ nào - là chọn một tập hợp con, bắt tay vào viết mã và dần dần tìm hiểu thêm về ngôn ngữ, thư viện và công cụ của ngôn ngữ đó. Đối với gợi ý của tôi về cách người mới bắt đầu có thể tiếp cận C++, hãy xem phần Lập trình. Nguyên tắc và thực hành sử dụng C++

Ai sử dụng C++?

Rất nhiều công ty và trang web của chính phủ. Rất nhiều. Và nếu bạn đang sử dụng trình biên dịch hoặc thời gian chạy của ngôn ngữ khác, chẳng hạn như Java, thì rất có thể nó cũng được triển khai trong C++

Có quá nhiều người dùng C++ để có thể đếm hết, nhưng con số lên đến hàng triệu. C++ được hỗ trợ bởi tất cả các nhà cung cấp lớn. Số lượng lớn nhà phát triển (và do đó, số lượng lớn cơ sở hạ tầng hỗ trợ có sẵn bao gồm nhà cung cấp, công cụ, đào tạo, v.v. ) là một trong số

Trong thời gian 1980-1991, số lượng người dùng tăng gấp đôi sau mỗi bảy tháng rưỡi (xem Thiết kế và sự phát triển của C++). Tốc độ tăng trưởng hiện tại là ổn định và tích cực. Ước tính năm 2001 của IDC về số lượng lập trình viên C++ là “khoảng 3 triệu”; . ” Điều đó có vẻ hợp lý và cho thấy sự tăng trưởng liên tục. Đặc biệt là từ khoảng năm 2010, C++ đã có sự phát triển mới khi cả ứng dụng di động và trung tâm dữ liệu đều đánh giá “hiệu suất trên mỗi Watt” như một thước đo chính mới

Mất bao lâu để học C++?

Điều đó phụ thuộc vào ý của bạn là “học. ” Nếu bạn là một lập trình viên C, bạn có thể học đủ C++ để giúp bạn lập trình kiểu C hiệu quả hơn trong một ngày

Cuốn sách lập trình. Nguyên tắc và Thực hành sử dụng C++ đã được sử dụng để giúp hàng nghìn sinh viên năm nhất (sinh viên năm thứ nhất) thông qua các nguyên tắc cơ bản của C++ và các kỹ thuật lập trình mà nó hỗ trợ (đặc biệt là lập trình hướng đối tượng và lập trình chung) trong một học kỳ

Mặt khác, nếu bạn muốn hoàn toàn thoải mái với tất cả các cấu trúc chính của ngôn ngữ C++, với tính trừu tượng hóa dữ liệu, lập trình Hướng đối tượng, lập trình chung, thiết kế Hướng đối tượng, v.v. , bạn có thể dễ dàng dành một hoặc hai năm – nếu bạn chưa quen với những kỹ thuật đó (chẳng hạn như từ Java hoặc C#)

Đó có phải là thời gian cần thiết để học C++ không? . Nếu mục tiêu của chúng ta là thay đổi đáng kể cách chúng ta làm việc và suy nghĩ về việc xây dựng hệ thống, thì tại sao phải bận tâm học một ngôn ngữ mới?

Để biết thêm các quan sát về việc học C++, hãy xem D&E hoặc ghi chú mà Bjarne Stroustrup đã viết cách đây một thời gian

Các công ty dạy thành công “các khóa học ngắn hạn” trong ngành tiêu chuẩn, trong đó một khóa học học kỳ đại học được nén thành một tuần làm việc 40 giờ. Nhưng bất kể bạn được đào tạo ở đâu, hãy đảm bảo rằng các khóa học có yếu tố thực hành, vì hầu hết mọi người học tốt nhất khi họ có các dự án để trợ giúp các khái niệm “gel. ” Nhưng ngay cả khi họ được đào tạo tốt nhất, họ vẫn chưa sẵn sàng

Phải mất 6-12 tháng để trở nên thành thạo rộng rãi về C++, đặc biệt nếu bạn chưa từng lập trình OO hoặc lập trình chung trước đây. Sẽ mất ít thời gian hơn cho các nhà phát triển, những người có quyền truy cập dễ dàng vào nhóm chuyên gia “tại địa phương”, sẽ mất nhiều thời gian hơn nếu không có sẵn thư viện lớp C++ mục đích chung “tốt”. Để trở thành một trong những chuyên gia có thể tư vấn cho người khác mất khoảng 3 năm

Một số người không bao giờ làm được. Bạn không có cơ hội trừ khi bạn có thể dạy được và có động lực cá nhân. Ở mức tối thiểu về “khả năng dạy dỗ”, bạn phải có khả năng thừa nhận khi mình sai. Ở mức tối thiểu khi “lái xe”, bạn phải sẵn sàng bỏ thêm vài giờ. Nhớ. việc tìm hiểu một số sự thật mới dễ dàng hơn nhiều so với việc thay đổi mô hình của bạn, tôi. e. , để thay đổi cách bạn nghĩ;

Hai điều bạn nên làm

  • Nhận cho người của bạn hai cuốn sách. cái này, cái khác
  • Cân nhắc đưa vào

Hai điều bạn không nên làm

Cách tốt nhất để cải thiện chương trình C++ của tôi là gì?

Điều đó phụ thuộc vào cách bạn sử dụng nó. Hầu hết mọi người đánh giá thấp các lớp và mẫu trừu tượng. Ngược lại, hầu hết mọi người đều lạm dụng quá mức các diễn viên và macro. Hãy xem một trong những bài báo hoặc sách của Stroustrup để biết ý tưởng. Một cách nghĩ về các lớp và mẫu trừu tượng là các giao diện cho phép trình bày các dịch vụ hợp lý và rõ ràng hơn là dễ dàng cung cấp thông qua các chức năng hoặc hệ thống phân cấp lớp đơn gốc. Xem các phần khác của Câu hỏi thường gặp này để biết một số ví dụ và ý tưởng cụ thể

Tôi sử dụng ngôn ngữ lập trình nào có quan trọng không?

Có, nhưng đừng mong đợi phép màu. Một số người dường như tin rằng một ngôn ngữ lập trình có thể hoặc ít nhất nên giải quyết hầu hết các vấn đề của họ với việc xây dựng hệ thống. Họ bị buộc phải tìm kiếm mãi mãi ngôn ngữ lập trình hoàn hảo và thất vọng nhiều lần. Những người khác coi ngôn ngữ lập trình là “chi tiết triển khai” không quan trọng và đầu tư tiền của họ vào các quy trình phát triển và phương pháp thiết kế. Họ bị buộc phải lập trình bằng COBOL, C và các ngôn ngữ thiết kế độc quyền mãi mãi. Một ngôn ngữ tốt – chẳng hạn như C++ – có thể giúp ích rất nhiều cho nhà thiết kế và lập trình viên, miễn là các điểm mạnh và hạn chế của nó được hiểu rõ ràng và tôn trọng

Một số tính năng của C ++ từ góc độ kinh doanh là gì?

Dưới đây là một vài tính năng của OO/C++ từ một

  • C++ có , có nghĩa là bạn sẽ có , ngoài ra bạn sẽ có một mục hàng rất có giá trị trong sơ yếu lý lịch của mình
  • C++ cho phép các nhà phát triển cung cấp các khối phần mềm, giúp cải thiện tỷ lệ lỗi khi các khối đó được (tái) sử dụng
  • C++ cho phép bạn khai thác trực giác của nhà phát triển thông qua , giúp giảm thời gian học tập cho (tái) người dùng
  • C++ thành một đoạn phần mềm, giúp giảm chi phí thay đổi
  • C++ giảm , giúp cải thiện chi phí (tái) sử dụng một đoạn phần mềm
  • C++ giảm , giúp cải thiện tỷ lệ lỗi mà không làm giảm hiệu suất
  • C++ cung cấp cho bạn let , giúp bạn có thể nhanh chóng mở rộng/điều chỉnh phần mềm của mình để đạt được các cửa sổ thị trường hẹp

Các hàm void f(Driver& d) // use driver { Status old_status = d.check(); // ... d.reset(); char buf[512]; int x = d.read(buf,512); // ... } 1 (liên kết động) có phải là trung tâm của OO/C++ không?

có và không. Tính đa hình động kiểu OO, mà bạn có được bằng cách gọi các hàm ảo, là một trong hai cách chính mà C++ cung cấp để đạt được tính đa hình và là cách bạn nên sử dụng cho những thứ không thể biết được tại thời điểm biên dịch. Cái còn lại là tính đa hình tĩnh theo phong cách lập trình chung, mà bạn có được bằng cách sử dụng các mẫu và bạn thường nên sử dụng cho những thứ đã biết tại thời điểm biên dịch. Họ là hai sở thích tuyệt vời mà hương vị tuyệt vời cùng nhau

Không có hàm ảo, C++ sẽ không hướng đối tượng. Nạp chồng toán tử và các hàm thành viên không phải ____8_______1 rất tuyệt vời, nhưng xét cho cùng, chúng chỉ là đường cú pháp cho khái niệm C điển hình hơn về việc chuyển một con trỏ tới một ________3 tới một hàm. Nó chứa nhiều mẫu minh họa các kỹ thuật “lập trình chung”, cũng rất tuyệt, nhưng các hàm

void f(Driver& d)               // use driver
{
    Status old_status = d.check();  
    // ...
    d.reset();
    char buf[512];
    int x = d.read(buf,512);
    // ...
}
1 vẫn là trung tâm của lập trình hướng đối tượng sử dụng C++

Từ a , có rất ít lý do để chuyển từ C thẳng sang C++ mà không có hàm

void f(Driver& d)               // use driver
{
    Status old_status = d.check();  
    // ...
    d.reset();
    char buf[512];
    int x = d.read(buf,512);
    // ...
}
1 (hiện tại chúng ta sẽ bỏ qua lập trình chung và ). Những người làm kỹ thuật thường nghĩ rằng có sự khác biệt lớn giữa C và C++ không phải OO, nhưng không có OO, sự khác biệt thường không đủ để biện minh cho chi phí đào tạo nhà phát triển, công cụ mới, v.v. Nói cách khác, nếu tôi tư vấn cho người quản lý về việc có nên chuyển từ C sang non-OO C++ (i. e. , để chuyển đổi ngôn ngữ chứ không phải mô hình), tôi có thể sẽ không khuyến khích anh ấy hoặc cô ấy trừ khi có những lý do thuyết phục về công cụ. Từ a, OO có thể giúp làm cho các hệ thống có thể mở rộng và thích nghi, nhưng chỉ cú pháp của các lớp C++ mà không có OO thậm chí có thể không làm giảm chi phí bảo trì và nó chắc chắn làm tăng đáng kể chi phí đào tạo

dòng dưới cùng. C++ không có

void f(Driver& d)               // use driver
{
    Status old_status = d.check();  
    // ...
    d.reset();
    char buf[512];
    int x = d.read(buf,512);
    // ...
}
1 thì không phải là OO. Lập trình với các lớp nhưng không có ràng buộc động được gọi là “dựa trên đối tượng”, nhưng không phải là “hướng đối tượng. ” Vứt bỏ các hàm
void f(Driver& d)               // use driver
{
    Status old_status = d.check();  
    // ...
    d.reset();
    char buf[512];
    int x = d.read(buf,512);
    // ...
}
1 cũng giống như loại bỏ OO. Tất cả những gì bạn còn lại là lập trình dựa trên đối tượng, tương tự như ngôn ngữ Ada ban đầu (nhân tiện, ngôn ngữ Ada được cập nhật hỗ trợ OO thực sự thay vì chỉ lập trình dựa trên đối tượng)

Ghi chú. bạn không cần

void f(Driver& d)               // use driver
{
    Status old_status = d.check();  
    // ...
    d.reset();
    char buf[512];
    int x = d.read(buf,512);
    // ...
}
1 chức năng cho. Trong số những thứ khác, điều này có nghĩa là bạn không thể biết bạn đã sử dụng mô hình nào chỉ bằng cách đếm số lượng
void f(Driver& d)               // use driver
{
    Status old_status = d.check();  
    // ...
    d.reset();
    char buf[512];
    int x = d.read(buf,512);
    // ...
}
1 chức năng mà bạn có

tôi đến từ Missouri. Bạn có thể cho tôi một lý do đơn giản tại sao các hàm void f(Driver& d) // use driver { Status old_status = d.check(); // ... d.reset(); char buf[512]; int x = d.read(buf,512); // ... } 1 (liên kết động, đa hình động) và mẫu (đa hình tĩnh) lại tạo nên sự khác biệt lớn không?

Họ có thể cải thiện khả năng sử dụng lại bằng cách cho phép mã cũ gọi mã mới được cung cấp trong thời gian chạy (hàm ảo) hoặc thời gian biên dịch (mẫu)

Trước khi OO và lập trình chung xuất hiện, việc sử dụng lại được thực hiện bằng cách gọi mã mới mã cũ. Ví dụ: một lập trình viên có thể viết một số mã được gọi là mã có thể tái sử dụng, chẳng hạn như

void g()
{
    Driver1 d1(Register(0xf00));  // create a Driver1 for device
                                  // with device register at address 0xf00

    Driver2 d2(Register(0xa00));  // create a Driver2 for device
                                  // with device register at address 0xa00
    // ...
    int dev;
    cin >> dev;

    if (dev==1) 
        f(d1);  // use d1
    else
        f(d2);  // use d2
    // ...
}
1

Với OO và lập trình chung, việc tái sử dụng cũng có thể được thực hiện bằng cách yêu cầu mã cũ gọi mã mới. Ví dụ: một lập trình viên có thể viết một số mã được gọi bởi một khung được viết bởi ông cố của họ. Không cần phải thay đổi mã của ông cố. Trên thực tế, đối với liên kết động với các chức năng ảo, nó thậm chí không cần phải biên dịch lại. Ngay cả khi tất cả những gì bạn còn lại là tệp đối tượng và mã nguồn mà ông cố đã viết đã bị thất lạc 25 năm trước, thì tệp đối tượng cổ xưa đó sẽ gọi phần mở rộng mới mà không có gì bị hỏng

Đó là khả năng mở rộng, và đó là OO và lập trình chung để trừu tượng hóa có thể tái sử dụng mạnh mẽ

C++ có tương thích ngược với ANSI/ISO C không?

Hầu hết. Xem thêm

C ++ càng gần càng tốt để tương thích với C, nhưng không gần hơn. Trong thực tế, sự khác biệt chính là C++ yêu cầu các nguyên mẫu, và

class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};
7 khai báo một hàm không có tham số (trong C, một hàm được khai báo bằng cách sử dụng
class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};
7 có thể được truyền một số lượng tùy ý các tham số thuộc các loại tùy ý)

Cũng có một số khác biệt rất nhỏ, chẳng hạn như

void g()
{
    Driver1 d1(Register(0xf00));  // create a Driver1 for device
                                  // with device register at address 0xf00

    Driver2 d2(Register(0xa00));  // create a Driver2 for device
                                  // with device register at address 0xa00
    // ...
    int dev;
    cin >> dev;

    if (dev==1) 
        f(d1);  // use d1
    else
        f(d2);  // use d2
    // ...
}
4 bằng với
void g()
{
    Driver1 d1(Register(0xf00));  // create a Driver1 for device
                                  // with device register at address 0xf00

    Driver2 d2(Register(0xa00));  // create a Driver2 for device
                                  // with device register at address 0xa00
    // ...
    int dev;
    cin >> dev;

    if (dev==1) 
        f(d1);  // use d1
    else
        f(d2);  // use d2
    // ...
}
5 trong C++ nhưng lại bằng với
void g()
{
    Driver1 d1(Register(0xf00));  // create a Driver1 for device
                                  // with device register at address 0xf00

    Driver2 d2(Register(0xa00));  // create a Driver2 for device
                                  // with device register at address 0xa00
    // ...
    int dev;
    cin >> dev;

    if (dev==1) 
        f(d1);  // use d1
    else
        f(d2);  // use d2
    // ...
}
6 trong C. Ngoài ra, C++ đặt cấu trúc “các thẻ” trong cùng một không gian tên với các tên khác, trong khi C yêu cầu một ____________3 rõ ràng (e. g. , kỹ thuật
void g()
{
    Driver1 d1(Register(0xf00));  // create a Driver1 for device
                                  // with device register at address 0xf00

    Driver2 d2(Register(0xa00));  // create a Driver2 for device
                                  // with device register at address 0xa00
    // ...
    int dev;
    cin >> dev;

    if (dev==1) 
        f(d1);  // use d1
    else
        f(d2);  // use d2
    // ...
}
8 vẫn hoạt động nhưng không cần thiết trong C++)

Tại sao C++ (gần như) tương thích với C?

Khi Stroustrup phát minh ra C++, ông ấy muốn C++ tương thích với một ngôn ngữ hoàn chỉnh với đủ hiệu năng và tính linh hoạt để lập trình ngay cả những hệ thống đòi hỏi khắt khe nhất. Anh ấy “hoàn toàn sợ hãi khi tạo ra một ngôn ngữ hay khác với những hạn chế không chủ ý. ” Xem Phần 2. 7 của Thiết kế và sự phát triển của C ++ để biết chi tiết lịch sử

Vào thời điểm đó, Stroustrup coi C là ngôn ngữ lập trình hệ thống tốt nhất hiện có. Điều đó không rõ ràng vào thời điểm đó (1979) như sau này, nhưng Stroustrup có các chuyên gia như Dennis Ritchie, Steve Johnson, Sandy Fraser, Greg Chesson, Doug McIlroy và Brian Kernighan ở hành lang để ông có thể học hỏi và nhận phản hồi. Nếu không có sự giúp đỡ và lời khuyên của họ, và không có C, C++ sẽ chết yểu

Trái ngược với những tin đồn lặp đi lặp lại, Stroustrup chưa bao giờ được thông báo rằng anh ta phải sử dụng C; . Trên thực tế, sách hướng dẫn C++ đầu tiên phát triển từ nguồn troff của sách hướng dẫn C do Dennis Ritchie đóng góp. Nhiều ngôn ngữ mới được thiết kế tại phòng thí nghiệm Bell;

C++ được phát minh khi nào?

Bjarne Stroustrup bắt đầu làm việc với C++ vào năm 1979. Phiên bản ban đầu được gọi là “C with Classes”. Phiên bản đầu tiên của C++ được sử dụng nội bộ trong AT&T vào tháng 8 năm 1983. Cái tên “C++” được sử dụng vào cuối năm đó. Phiên bản thương mại đầu tiên được phát hành vào tháng 10 năm 1985 cùng lúc với ấn bản đầu tiên của Ngôn ngữ lập trình C++. Các mẫu và xử lý ngoại lệ được đưa vào sau này vào những năm 1980 và được ghi lại trong The Annotated C++ Reference Manual và The C++ Programming Language (2nd Edition)

Định nghĩa hiện tại của C++ là Tiêu chuẩn ISO C++ và được mô tả trong Ngôn ngữ lập trình C++ (Phiên bản thứ 4)

Bạn có thể tìm thấy dòng thời gian đầy đủ hơn và giải thích chi tiết hơn trong Thiết kế và sự phát triển của C++ và Lịch sử của C++. 1979-1991

Tại sao C++ được phát minh?

Stroustrup muốn viết các chương trình hệ thống hiệu quả theo phong cách được khuyến khích bởi Simula67. Để làm được điều đó, ông đã thêm các phương tiện để kiểm tra kiểu, trừu tượng hóa dữ liệu và lập trình hướng đối tượng tốt hơn cho C. Mục đích chung hơn là thiết kế một ngôn ngữ trong đó các nhà phát triển có thể viết các chương trình vừa hiệu quả vừa thanh lịch. Nhiều ngôn ngữ buộc bạn phải chọn giữa hai lựa chọn thay thế đó

Các nhiệm vụ cụ thể khiến Stroustrup bắt đầu thiết kế và triển khai C++ (ban đầu được gọi là “C with Classes”) phải thực hiện với việc phân phối các cơ sở hệ điều hành trên mạng.

Bạn có thể tìm thấy các giải thích chi tiết hơn trong Thiết kế và Sự phát triển của C++. Xem thêm Lịch sử của C++. 1979-1991 và Phát triển một ngôn ngữ trong và cho thế giới thực. C++ 1991-2006

Cái tên C++ bắt nguồn từ đâu?

Trong Chương 3 của D&E, Stroustrup đã viết

Tôi chọn C++ vì nó ngắn gọn, diễn giải hay và không thuộc dạng “tính từ C”. ”

Trong C,

void g()
{
    Driver1 d1(Register(0xf00));  // create a Driver1 for device
                                  // with device register at address 0xf00

    Driver2 d2(Register(0xa00));  // create a Driver2 for device
                                  // with device register at address 0xa00
    // ...
    int dev;
    cin >> dev;

    if (dev==1) 
        f(d1);  // use d1
    else
        f(d2);  // use d2
    // ...
}
9 có thể, tùy thuộc vào ngữ cảnh, được đọc là “tiếp theo”, “kế thừa” hoặc “tăng dần”, mặc dù nó luôn được phát âm là “cộng cộng. ” Cái tên C++ và người về sau là ++C là nguồn phong phú cho những trò đùa và chơi chữ – hầu như tất cả đều được biết đến và đánh giá cao trước khi cái tên được chọn. Tên C++ được đề xuất bởi Rick Mascitti. Nó được sử dụng lần đầu tiên vào tháng 12 năm 1983 khi nó được chỉnh sửa thành các bản sao cuối cùng của [Stroustrup,1984] và [Stroustrup,1984c]

Trong chương 1 của TC++PL, Stroustrup đã viết

Cái tên C++ (phát âm là “see plus plus”) do Rick Mascitti đặt ra vào mùa hè năm 1983. Tên biểu thị bản chất tiến hóa của những thay đổi từ C; . Tên ngắn hơn một chút “C+” là một lỗi cú pháp; . Những người sành sỏi về ngữ nghĩa C thấy C++ kém hơn ++C. Ngôn ngữ này không được gọi là D, vì nó là phần mở rộng của C và nó không cố gắng khắc phục sự cố bằng cách xóa các tính năng. Để biết cách giải thích khác về tên C++, hãy xem phần phụ lục của [Orwell,1949]

Chữ “C” trong C++ có lịch sử lâu đời. Đương nhiên, đó là tên của ngôn ngữ mà Dennis Ritchie đã thiết kế. Tổ tiên trực tiếp của C là hậu duệ được giải thích của BCPL được gọi là B do Ken Thompson thiết kế. BCPL được thiết kế và triển khai bởi Martin Richards từ Đại học Cambridge khi đến thăm MIT ở Cambridge khác. BCPL lần lượt là CPL cơ bản, trong đó CPL là tên của một ngôn ngữ lập trình khá lớn (vào thời điểm đó) và thanh lịch được phát triển bởi các trường đại học Cambridge và London. Trước khi người London tham gia dự án “C” là viết tắt của Cambridge. Sau đó, “C” chính thức là viết tắt của tổ hợp. Không chính thức, “C” là viết tắt của Christopher vì Christopher Strachey là người có quyền lực chính đằng sau CPL

Tại sao C++ cho phép mã không an toàn?

Đó là, tại sao C ++ hỗ trợ các hoạt động có thể được sử dụng để vi phạm các quy tắc an toàn kiểu tĩnh (thời gian biên dịch)?

  • để truy cập phần cứng trực tiếp (e. g. để coi một số nguyên là một con trỏ tới (địa chỉ của) một thanh ghi thiết bị)
  • để đạt được hiệu suất không gian và thời gian chạy tối ưu (e. g. truy cập không được kiểm soát vào các phần tử của một mảng và truy cập không được kiểm soát vào một đối tượng thông qua một con trỏ)
  • tương thích với C

Điều đó nói rằng, bạn nên tránh mã không an toàn như bệnh dịch hạch bất cứ khi nào bạn không thực sự cần một trong ba tính năng đó

  • không sử dụng diễn viên
  • giữ các mảng kiểu C
    auto p = find(begin(vs), end(vs), "Grail"s); // vector vs; p is vector::iterator 
    
    auto q = find(begin(vi), end(vi), 42);       // vector vi;    q is vector::iterator 
    
    auto r = find(begin(ld), end(ld), 1.2);      // list ld;   r is list::iterator 
    
    auto s = find(begin(ar), end(ar), 10);       // int ar[10];        s is int *
    
    1 ngoài giao diện (giấu chúng trong phần bên trong của các hàm và lớp hiệu suất cao khi cần và viết phần còn lại của chương trình bằng cách sử dụng đúng các ____6_______6, ____1_______3, v.v. )
  • tránh
    auto p = find(begin(vs), end(vs), "Grail"s); // vector vs; p is vector::iterator 
    
    auto q = find(begin(vi), end(vi), 42);       // vector vi;    q is vector::iterator 
    
    auto r = find(begin(ld), end(ld), 1.2);      // list ld;   r is list::iterator 
    
    auto s = find(begin(ar), end(ar), 10);       // int ar[10];        s is int *
    
    4 (giữ chúng bên trong các chức năng cấp thấp và cấu trúc dữ liệu nếu bạn thực sự cần chúng và trình bày các giao diện an toàn, thường là các mẫu, cho người dùng của bạn)
  • tránh
    auto p = find(begin(vs), end(vs), "Grail"s); // vector vs; p is vector::iterator 
    
    auto q = find(begin(vi), end(vi), 42);       // vector vi;    q is vector::iterator 
    
    auto r = find(begin(ld), end(ld), 1.2);      // list ld;   r is list::iterator 
    
    auto s = find(begin(ar), end(ar), 10);       // int ar[10];        s is int *
    
    5 giây
  • nếu bạn có bất kỳ nghi ngờ nào về tính hợp lệ của con trỏ, hãy sử dụng con trỏ thông minh để thay thế
  • không sử dụng “trần trụi”
    auto p = find(begin(vs), end(vs), "Grail"s); // vector vs; p is vector::iterator 
    
    auto q = find(begin(vi), end(vi), 42);       // vector vi;    q is vector::iterator 
    
    auto r = find(begin(ld), end(ld), 1.2);      // list ld;   r is list::iterator 
    
    auto s = find(begin(ar), end(ar), 10);       // int ar[10];        s is int *
    
    6 và
    auto p = find(begin(vs), end(vs), "Grail"s); // vector vs; p is vector::iterator 
    
    auto q = find(begin(vi), end(vi), 42);       // vector vi;    q is vector::iterator 
    
    auto r = find(begin(ld), end(ld), 1.2);      // list ld;   r is list::iterator 
    
    auto s = find(begin(ar), end(ar), 10);       // int ar[10];        s is int *
    
    7 (sử dụng thùng chứa, tay cầm tài nguyên, v.v. , thay thế)
  • không sử dụng các hàm biến thiên kiểu
    auto p = find(begin(vs), end(vs), "Grail"s); // vector vs; p is vector::iterator 
    
    auto q = find(begin(vi), end(vi), 42);       // vector vi;    q is vector::iterator 
    
    auto r = find(begin(ld), end(ld), 1.2);      // list ld;   r is list::iterator 
    
    auto s = find(begin(ar), end(ar), 10);       // int ar[10];        s is int *
    
    8 (“kiểu ____28_______9”)
  • ngoại trừ
    void draw_all(vector& vs)   // draw each element of a standard vector
    {
        for_each(vs.begin(),vs.end(),[](Shape* p){ p->draw(); });
    }
    
    0 bảo vệ

Hầu như tất cả mã C++ đều có thể tuân theo các quy tắc đơn giản này. Xin đừng bối rối bởi thực tế là bạn không thể tuân theo các quy tắc này nếu bạn viết mã C hoặc mã kiểu C trong C++

Tại sao một số thứ không được xác định trong C++?

Bởi vì các máy khác nhau và vì C còn nhiều thứ không xác định. Để biết chi tiết, bao gồm cả định nghĩa của các thuật ngữ “không xác định”, “không xác định”, “xác định triển khai” và “đúng định dạng”; . Lưu ý rằng ý nghĩa của các thuật ngữ đó khác với định nghĩa của tiêu chuẩn ISO C và với một số cách sử dụng phổ biến. Bạn có thể nhận được những cuộc thảo luận vô cùng bối rối khi mọi người không nhận ra rằng không phải ai cũng chia sẻ định nghĩa

Đây là một câu trả lời đúng, nếu không thỏa đáng,. Giống như C, C++ được dùng để khai thác phần cứng một cách trực tiếp và hiệu quả. Điều này ngụ ý rằng C++ phải xử lý các thực thể phần cứng như bit, byte, từ, địa chỉ, tính toán số nguyên và tính toán dấu chấm động theo cách chúng hoạt động trên một máy nhất định, thay vì cách chúng ta muốn chúng hoạt động. Lưu ý rằng nhiều "thứ" mà mọi người gọi là "không xác định" trên thực tế là "xác định triển khai", vì vậy chúng ta có thể viết mã được chỉ định hoàn hảo miễn là chúng ta biết mình đang chạy trên máy nào. Kích thước của các số nguyên và hành vi làm tròn của các tính toán dấu phẩy động thuộc loại đó

Xem xét những gì có lẽ là ví dụ nổi tiếng nhất và nổi tiếng nhất về hành vi không xác định

    int a[10];
    a[100] = 0; // range error
    int* p = a;
    // ...
    p[100] = 0; // range error (unless we gave p a better value before that assignment)

Khái niệm mảng và con trỏ trong C++ (và C) là các biểu diễn trực tiếp khái niệm bộ nhớ và địa chỉ của máy, được cung cấp miễn phí. Các thao tác nguyên thủy trên con trỏ ánh xạ trực tiếp lên các lệnh của máy. Đặc biệt, không có kiểm tra phạm vi được thực hiện. Thực hiện kiểm tra phạm vi sẽ áp đặt chi phí về thời gian chạy và kích thước mã. C được thiết kế để cạnh tranh với mã hợp ngữ cho các tác vụ của hệ điều hành, vì vậy đó là một quyết định cần thiết. Ngoài ra, C - không giống như C++ - không có cách hợp lý nào để báo cáo vi phạm nếu trình biên dịch quyết định tạo mã để phát hiện vi phạm. Không có ngoại lệ trong C. C++ theo sau C vì lý do tương thích và vì C++ cũng cạnh tranh trực tiếp với trình hợp dịch mã (trong HĐH, hệ thống nhúng và một số lĩnh vực tính toán số). Nếu bạn muốn kiểm tra phạm vi, hãy sử dụng lớp được kiểm tra phù hợp (_______1_______3, con trỏ thông minh,

class Driver1 : public Driver { // a driver
public:
    Driver1(Register);          // constructor
    int read(char*, int n) override;    
    bool reset() override;
    Status check() override;
private:
    // implementation details, including representation
};

class Driver2 : public Driver { // another driver
public:
    Driver2(Register);
    int read(char*, int n) override;    
    bool reset() override;
    Status check() override;
private:
    // implementation details, including representation
};
6, v.v. ). Một trình biên dịch tốt có thể phát hiện lỗi phạm vi cho
void draw_all(vector& vs)   // draw each element of a standard vector
{
    for_each(vs.begin(),vs.end(),[](Shape* p){ p->draw(); });
}
3 tại thời điểm biên dịch, việc phát hiện lỗi cho
void draw_all(vector& vs)   // draw each element of a standard vector
{
    for_each(vs.begin(),vs.end(),[](Shape* p){ p->draw(); });
}
4 khó hơn nhiều và nói chung là không thể bắt được mọi lỗi phạm vi tại thời điểm biên dịch

Các ví dụ khác về hành vi không xác định bắt nguồn từ mô hình biên dịch. Trình biên dịch không thể phát hiện định nghĩa không nhất quán của một đối tượng hoặc một hàm trong các đơn vị dịch thuật được biên dịch riêng. Ví dụ

class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};
0

Biên dịch

void draw_all(vector& vs)   // draw each element of a standard vector
{
    for_each(vs.begin(),vs.end(),[](Shape* p){ p->draw(); });
}
5 và
void draw_all(vector& vs)   // draw each element of a standard vector
{
    for_each(vs.begin(),vs.end(),[](Shape* p){ p->draw(); });
}
6 và liên kết các kết quả vào cùng một chương trình là bất hợp pháp trong cả C và C++. Một trình liên kết có thể bắt được định nghĩa không nhất quán của
void draw_all(vector& vs)   // draw each element of a standard vector
{
    for_each(vs.begin(),vs.end(),[](Shape* p){ p->draw(); });
}
7, nhưng không bắt buộc phải làm như vậy (và hầu hết là không). Trong nhiều trường hợp, rất khó để phát hiện sự không nhất quán giữa các đơn vị dịch thuật được biên dịch riêng biệt. Việc sử dụng nhất quán các tệp tiêu đề giúp giảm thiểu các sự cố như vậy và có một số dấu hiệu cho thấy trình liên kết đang được cải thiện. Lưu ý rằng các trình liên kết C++ bắt được hầu hết các lỗi liên quan đến các hàm được khai báo không nhất quán

Cuối cùng, chúng ta có hành vi không xác định dường như không cần thiết và khá khó chịu của các biểu thức riêng lẻ. Ví dụ

class File_handle {
public:
    File_handle(const char* n, const char* rw)
        { f = fopen(n,rw); if (f==nullptr) throw Open_failure(n); }
    ~File_handle() { fclose(f); } // destructor
    // ...
private:
    FILE* f;
};
1

Giá trị của

void draw_all(vector& vs)   // draw each element of a standard vector
{
    for_each(vs.begin(),vs.end(),[](Shape* p){ p->draw(); });
}
8 không được chỉ định để cho phép trình biên dịch tạo mã tối ưu. Người ta khẳng định rằng sự khác biệt giữa những gì có thể được tạo ra mang lại cho trình biên dịch sự tự do này và yêu cầu “đánh giá từ trái sang phải thông thường” có thể là đáng kể. Các chuyên gia hàng đầu không bị thuyết phục, nhưng với vô số trình biên dịch “ngoài kia” lợi dụng quyền tự do và một số người nhiệt tình bảo vệ quyền tự do đó, một sự thay đổi sẽ khó khăn và có thể mất hàng thập kỷ để thâm nhập vào các góc xa xôi của thế giới C và C++. Thật đáng thất vọng khi không phải tất cả các trình biên dịch đều cảnh báo chống lại mã như
void draw_all(vector& vs)   // draw each element of a standard vector
{
    for_each(vs.begin(),vs.end(),[](Shape* p){ p->draw(); });
}
9. Tương tự, thứ tự đánh giá các đối số là không xác định

Có một cảm giác rằng có quá nhiều “thứ” không được xác định, không được chỉ định, được xác định bởi triển khai, v.v. Để giải quyết vấn đề này, ủy ban ISO C++ đã tạo Nhóm nghiên cứu 12 để xem xét và đề xuất thắt chặt trên diện rộng để giảm hành vi không xác định, không xác định và do triển khai xác định

Tại sao tính di động được coi là rất quan trọng?

Phần mềm thành công tồn tại lâu dài; . Một ứng dụng/chương trình tốt thường tồn tại lâu hơn phần cứng được thiết kế cho nó, hệ điều hành được viết cho nó, hệ thống cơ sở dữ liệu mà nó sử dụng ban đầu, v.v. Thông thường, một phần mềm tốt tồn tại lâu hơn các công ty cung cấp các công nghệ cơ bản được sử dụng để xây dựng nó

Thường thì một ứng dụng/chương trình thành công có khách hàng/người dùng thích nhiều nền tảng khác nhau. Tập hợp các nền tảng mong muốn thay đổi khi dân số người dùng thay đổi. Bị ràng buộc với một nền tảng hoặc nhà cung cấp duy nhất, giới hạn khả năng sử dụng của ứng dụng/chương trình

Rõ ràng, sự độc lập hoàn toàn của nền tảng không tương thích với khả năng sử dụng tất cả các phương tiện cụ thể của nền tảng. Tuy nhiên, bạn thường có thể ước lượng tính độc lập của nền tảng cho một ứng dụng bằng cách truy cập các cơ sở của nền tảng thông qua một “giao diện mỏng” thể hiện chế độ xem của ứng dụng về môi trường của nó dưới dạng thư viện

C++ có được chuẩn hóa không?

Đúng

Tiêu chuẩn C++ đã được hoàn thiện và thông qua bởi ISO (Tổ chức tiêu chuẩn hóa quốc tế) cũng như một số tổ chức tiêu chuẩn quốc gia như INCITS (the U. S. Ủy ban Quốc gia về Tiêu chuẩn Công nghệ Thông tin), BSI (Viện Tiêu chuẩn Anh), DIN (tổ chức tiêu chuẩn quốc gia Đức). Tiêu chuẩn ISO đã được hoàn thiện và thông qua bằng một cuộc bỏ phiếu nhất trí vào tháng 11 năm 1997, với những cập nhật nhỏ vào năm 2003 và bây giờ là những cập nhật quan trọng và có giá trị vào năm 2011. Một bộ cập nhật khác dự kiến ​​sẽ được xuất bản vào năm 2014

các bạn. S. Ủy ban C++ được gọi là “PL22. 16”. Nhóm tiêu chuẩn ISO C++ được gọi là “WG21”. Những người chơi chính trong quy trình tiêu chuẩn C ++ đã bao gồm gần như tất cả mọi người. đại diện từ Úc, Canada, Đan Mạch, Phần Lan, Pháp, Đức, Ireland, Nhật Bản, Hà Lan, New Zealand, Thụy Điển, Vương quốc Anh và Hoa Kỳ, cùng với đại diện của khoảng một trăm công ty và nhiều cá nhân quan tâm. Những công ty lớn bao gồm AT&T, Ericsson, Digital, Borland, Hewlett Packard, IBM, Intel, Mentor Graphics, Microsoft, NVidia, Silicon Graphics, Sun Microsystems và Siemens

Để biết thêm thông tin, hãy xem các trang tiêu chuẩn hóa ISO C++, bao gồm nhưng không giới hạn ở

  • trang ủy ban
  • các cuộc họp và trang tham gia
  • bản tóm tắt thủ tục ISO/IEC JTC1

Ai là người trong ủy ban tiêu chuẩn hóa?

Xem thêm trang ủy ban

Ủy ban bao gồm một số lượng lớn người (khoảng 200 người), trong số đó có khoảng 100 người tham gia các cuộc họp kéo dài một tuần hai hoặc ba lần một năm. Ngoài ra còn có các nhóm tiêu chuẩn quốc gia và các cuộc họp ở một số quốc gia. Hầu hết các thành viên đóng góp bằng cách tham dự các cuộc họp, bằng cách tham gia vào các cuộc thảo luận qua email hoặc bằng cách gửi các bài báo để ủy ban xem xét. Hầu hết các thành viên đều có bạn bè và đồng nghiệp giúp đỡ họ. Từ ngày đầu tiên, ủy ban đã có các thành viên từ nhiều quốc gia và tại mỗi cuộc họp, mọi người từ nửa tá đến hàng chục quốc gia tham dự. Các cuộc bỏ phiếu cuối cùng được thực hiện bởi khoảng 20 cơ quan tiêu chuẩn quốc gia. Như vậy, việc chuẩn hóa ISO C++ là một nỗ lực khá lớn, không phải của một nhóm nhỏ những người làm việc chặt chẽ để tạo ra một ngôn ngữ hoàn hảo cho “những người giống như chính họ. ” Tiêu chuẩn là những gì nhóm tình nguyện viên này có thể đồng ý là sản phẩm tốt nhất họ có thể sản xuất mà tất cả mọi người đều có thể chung sống

Đương nhiên, nhiều (nhưng không phải tất cả) những tình nguyện viên này có công việc ban ngày tập trung vào C++. Họ bao gồm người viết trình biên dịch, người xây dựng công cụ, người viết thư viện, người xây dựng ứng dụng, nhà nghiên cứu, tác giả sách, chuyên gia tư vấn, người xây dựng bộ thử nghiệm, v.v.

Dưới đây là danh sách rất một phần của một số tổ chức lớn có liên quan. Adobe, Apple, Boost, Bloomberg, EDG, Google, HP, IBM, Intel, Microsoft, Oracle, Red Hat

Dưới đây là danh sách ngắn tên của các thành viên mà bạn có thể đã gặp trong tài liệu hoặc trên trang web. Dave Abrahams, Matt Austern, Pete Becker, Hans Boehm, Steve Clamage, Lawrence Crowl, Beman Dawes, Francis Glassborow, Doug Gregor, Pablo Halpern, Howard Hinnant, Jaakko Jarvi, John Lakos, Alisdair Meredith, Jens Maurer, Jason Merrill, Sean Parent . J. PlaugerTom PlumGabriel Dos ReisBjarne StroustrupHerb SutterDavid VandevoordeMichael Wong. Xin lỗi hơn 200 thành viên hiện tại và trước đây mà chúng tôi không thể liệt kê. Ngoài ra, xin lưu ý danh sách tác giả trên các giấy tờ khác nhau. một tiêu chuẩn được viết bởi (nhiều) cá nhân, không phải bởi một ủy ban ẩn danh

Bạn có thể có ấn tượng tốt hơn về hơi thở và chiều sâu chuyên môn liên quan bằng cách kiểm tra các tác giả được liệt kê trong kho lưu trữ bài báo của WG21, nhưng hãy nhớ rằng có những người đóng góp chính cho nỗ lực tiêu chuẩn không viết nhiều

Tôi có thể lấy bản sao của tiêu chuẩn C++ ở đâu?

Xem isocpp. trang Tiêu chuẩn của org

Sự khác biệt giữa C++98 và C++03 là gì?

Từ quan điểm của một lập trình viên, không có. Bản sửa đổi C++03 của tiêu chuẩn là một bản phát hành sửa lỗi cho những người triển khai để đảm bảo tính nhất quán và tính di động cao hơn. Đặc biệt, tài liệu tham khảo và hướng dẫn mô tả C++98 và C++03 có thể được sử dụng thay thế cho nhau bởi tất cả ngoại trừ người viết trình biên dịch và chuyên gia tiêu chuẩn

Sự khác biệt giữa C++98 và C++0x là gì?

Tương tự như , bởi vì C++0x đã trở thành C++11.

template
void draw_all(C& cs)    // draw each element of a standard container
{
    for_each(cs.begin(),cs.end(),[](Shape* p){ p->draw(); });
}
0 C++0x chuyển sang hệ thập lục phân; . . )

Sự khác biệt giữa C++ 98 và C++ 11 là gì?

Xem có gì mới trong C++11

Lưu ý rằng ngôn ngữ C++ sẽ vẫn ổn định vì khả năng tương thích luôn là mối quan tâm chính. Ủy ban cố gắng hết sức để không phá vỡ mã (tuân thủ tiêu chuẩn) của bạn. Ngoại trừ một số trường hợp góc mà bạn khó có thể nhận thấy, tất cả mã C++98 hợp lệ đều là mã C++11 và C++14 hợp lệ

Sự khác biệt giữa C++11 và C++14 là gì?

Xem có gì mới trong C++14

Lưu ý rằng ngôn ngữ C++ sẽ vẫn ổn định vì khả năng tương thích luôn là mối quan tâm chính. Ủy ban cố gắng hết sức để không phá vỡ mã (tuân thủ tiêu chuẩn) của bạn. Ngoại trừ một số trường hợp góc mà bạn khó có thể nhận thấy, tất cả mã C++98 hợp lệ đều là mã C++14 hợp lệ

Tôi có thể hỏi một số “câu hỏi phỏng vấn” nào để cho tôi biết liệu các ứng viên có thực sự hiểu rõ công việc của họ không?

Câu trả lời này chủ yếu dành cho các nhà quản lý phi kỹ thuật và những người làm nhân sự đang cố gắng làm tốt công việc phỏng vấn các ứng viên C ++. Nếu bạn là một lập trình viên C++ sắp được phỏng vấn, và nếu bạn đang ẩn nấp trong Câu hỏi thường gặp này với hy vọng biết trước những câu hỏi họ sẽ hỏi bạn để bạn có thể tránh phải học C++ thực sự, thì thật xấu hổ cho bạn. dành thời gian của bạn để trở nên thành thạo về mặt kỹ thuật và bạn sẽ không phải cố gắng “gian lận” trong cuộc sống

Quay lại người quản lý phi kỹ thuật / người nhân sự. rõ ràng là bạn đủ tư cách để đánh giá liệu một ứng viên có “phù hợp” với văn hóa của công ty bạn hay không. Tuy nhiên, ngoài kia có đủ những kẻ lừa bịp, những kẻ muốn ăn bám và những kẻ giả tạo mà bạn thực sự cần phải hợp tác với một người có năng lực kỹ thuật để đảm bảo ứng viên có trình độ kỹ thuật phù hợp. Rất nhiều công ty đã bị đốt cháy bởi việc tuyển dụng những người tốt bụng nhưng không đủ năng lực - những người không đủ năng lực mặc dù thực tế là họ biết câu trả lời cho một số câu hỏi tối nghĩa. Cách duy nhất để loại bỏ những kẻ giả tạo và muốn trở thành một người có thể hỏi những câu hỏi kỹ thuật thâm nhập cùng bạn. Bạn không có hy vọng gì để làm điều đó cho mình. Ngay cả khi tôi đưa cho bạn một loạt “câu hỏi hóc búa”, họ cũng sẽ không loại được kẻ xấu

Người hỗ trợ kỹ thuật của bạn có thể không (và thường không) đủ tiêu chuẩn để đánh giá ứng viên về tính cách hoặc kỹ năng mềm, vì vậy vui lòng không từ bỏ vai trò là người phân xử cuối cùng trong quá trình ra quyết định. Nhưng xin đừng nghĩ rằng bạn có thể hỏi nửa tá câu hỏi C ++ và có manh mối nhỏ nhất nếu ứng viên thực sự biết họ đang nói gì từ góc độ kỹ thuật

Đã nói tất cả những điều đó, nếu bạn đủ kỹ thuật để đọc Câu hỏi thường gặp về C ++, bạn có thể tìm hiểu rất nhiều câu hỏi phỏng vấn hay tại đây. Câu hỏi thường gặp có rất nhiều điều thú vị sẽ tách lúa mì ra khỏi vỏ trấu. Câu hỏi thường gặp tập trung vào những gì lập trình viên nên làm, thay vì chỉ đơn thuần là những gì trình biên dịch sẽ cho phép họ làm. Có những thứ có thể làm bằng C++ nhưng không nên làm. Câu hỏi thường gặp giúp mọi người tách biệt hai điều đó

Câu hỏi thường gặp có nghĩa là gì bởi "như vậy và như vậy là xấu xa"?

Nó có nghĩa là như vậy và như vậy là điều bạn nên tránh hầu hết thời gian, nhưng không phải là điều bạn nên tránh mọi lúc. Ví dụ, cuối cùng bạn sẽ sử dụng những thứ “xấu xa” này bất cứ khi nào chúng là “thứ ít xấu xa nhất trong số những thứ thay thế xấu xa nhất”. “Đó là một trò đùa, được chứ?

Mục đích thực sự của thuật ngữ (“À ha,” tôi nghe bạn nói, “thực sự có một động cơ ẩn giấu. ”; . có) là giúp các lập trình viên C++ mới thoát khỏi một số suy nghĩ cũ của họ. Ví dụ, các lập trình viên C mới làm quen với C++ thường sử dụng con trỏ, mảng và/hoặc

template
void draw_all(C& cs)    // draw each element of a standard container
{
    for_each(cs.begin(),cs.end(),[](Shape* p){ p->draw(); });
}
1 nhiều hơn mức cần thiết. Câu hỏi thường gặp liệt kê những thứ đó là “xấu xa” để tạo cho các lập trình viên C++ mới một động lực mạnh mẽ (và khôi hài. ) đẩy đúng hướng. Mục tiêu của những điều khôi hài như “con trỏ là xấu xa” là để thuyết phục các lập trình viên C++ mới rằng C++ thực sự không “giống như C ngoại trừ những nhận xét
template
void draw_all(C& cs)    // draw each element of a standard container
{
    for_each(cs.begin(),cs.end(),[](Shape* p){ p->draw(); });
}
2 ngớ ngẩn đó. ”

Bây giờ chúng ta hãy thực tế ở đây. Tôi không đề xuất các macro hoặc mảng hoặc con trỏ ở ngay trên đó với vụ giết người hoặc bắt cóc. Vâng, có lẽ con trỏ. (đùa thôi. ) Vì vậy, đừng quá khích về từ "xấu xa". nó được cho là có vẻ hơi thái quá. Và đừng tìm kiếm một định nghĩa chính xác về mặt kỹ thuật về thời điểm chính xác một thứ gì đó là “xấu xa” hay không. không có một

Các mục được gắn nhãn là "ác" (macro, mảng, con trỏ, v.v. ) không phải lúc nào cũng xấu trong mọi tình huống. Khi chúng là “ít tệ nhất” trong các lựa chọn thay thế,

Đôi khi tôi có sử dụng bất kỳ cái gọi là cấu trúc "xấu xa" nào không?

tất nhiên bạn sẽ

Một kích thước không phù hợp với tất cả. Dừng lại. Ngay bây giờ, hãy lấy một chiếc bút dạ đầu nhỏ và viết lên mặt trong của chiếc kính của bạn. Phát triển phần mềm là ra quyết định. “Nghĩ” không phải là một từ có bốn chữ cái. Có rất ít quy tắc “không bao giờ…” và “luôn luôn…” trong phần mềm — quy tắc mà bạn có thể áp dụng mà không cần suy nghĩ — quy tắc luôn hoạt động trong mọi tình huống ở mọi thị trường — quy tắc một kích cỡ phù hợp với tất cả

Nói một cách đơn giản, bạn sẽ phải đưa ra quyết định và chất lượng quyết định của bạn sẽ ảnh hưởng đến phần mềm của bạn. Phát triển phần mềm không chủ yếu là tuân theo các quy tắc một cách mù quáng; . Và đôi khi bạn sẽ phải lựa chọn giữa một loạt các lựa chọn tồi tệ. Khi điều đó xảy ra, điều tốt nhất bạn có thể hy vọng là chọn điều tồi tệ nhất trong số các lựa chọn thay thế, điều ít tệ hại hơn. ”

Đôi khi bạn sẽ sử dụng các phương pháp và kỹ thuật được dán nhãn là “ác quỷ”. ” Nếu điều đó khiến bạn không thoải mái, hãy thay đổi từ “xấu xa” thành “thường xuyên không mong muốn” (nhưng đừng bỏ công việc hàng ngày của bạn để trở thành một tác giả. thuật ngữ milquetoast như thế đưa mọi người vào giấc ngủ. -)

Điều quan trọng là phải biết định nghĩa kỹ thuật của “OO tốt”?

Bạn có thể không thích điều này, nhưng câu trả lời ngắn gọn là, “Không. ” (Với lời cảnh báo rằng câu trả lời này hướng đến các học viên, không phải các nhà lý thuyết. )

Các nhà thiết kế phần mềm trưởng thành đánh giá các tình huống dựa trên các tiêu chí kinh doanh (thời gian, tiền bạc và rủi ro) bên cạnh các tiêu chí kỹ thuật như liệu một thứ gì đó có phải là “hướng ngoại tốt” hay “thiết kế đẳng cấp hay không”. ” Điều này khó hơn rất nhiều vì nó liên quan đến các vấn đề kinh doanh (lịch trình, kỹ năng của mọi người, tìm hiểu hướng đi của công ty để chúng tôi biết nơi thiết kế tính linh hoạt cho phần mềm, sẵn sàng tính đến khả năng thay đổi trong tương lai - những thay đổi đó . ) ngoài các vấn đề kỹ thuật. Tuy nhiên, nó dẫn đến các quyết định có nhiều khả năng mang lại kết quả kinh doanh tốt hơn

Với tư cách là nhà phát triển, bạn có trách nhiệm ủy thác cho chủ lao động của mình là chỉ đầu tư theo những cách có kỳ vọng hợp lý về lợi tức đầu tư đó. Nếu bạn không hỏi các câu hỏi kinh doanh ngoài các câu hỏi kỹ thuật, bạn sẽ đưa ra các quyết định có hậu quả kinh doanh ngẫu nhiên và không thể đoán trước

Dù muốn hay không, điều đó có nghĩa là trong thực tế, có lẽ tốt hơn hết là bạn nên để các thuật ngữ như “thiết kế đẳng cấp tốt” và “hướng ngoại tốt” không được xác định. Trên thực tế, tôi tin rằng các định nghĩa chính xác, thuần túy về mặt kỹ thuật của những thuật ngữ đó có thể nguy hiểm và có thể khiến các công ty tốn tiền, thậm chí có thể khiến mọi người mất việc. Điều đó nghe có vẻ kỳ lạ, nhưng có một lý do thực sự tốt. nếu các thuật ngữ này được định nghĩa theo các thuật ngữ kỹ thuật thuần túy, chính xác, thì các nhà phát triển có thiện chí có xu hướng bỏ qua các cân nhắc về kinh doanh với mong muốn hoàn thành các định nghĩa kỹ thuật thuần túy này về “tốt. ”

Bất kỳ định nghĩa kỹ thuật thuần túy nào về “tốt”, chẳng hạn như “hướng ngoại tốt” hoặc “thiết kế tốt” hoặc bất kỳ thứ gì khác có thể được đánh giá mà không cần quan tâm đến lịch trình, mục tiêu kinh doanh (để chúng tôi biết nên đầu tư vào đâu), những thay đổi dự kiến ​​trong tương lai, văn hóa doanh nghiệp với . , nguy hiểm. Nó nguy hiểm vì nó đánh lừa các lập trình viên nghĩ rằng họ đang đưa ra những quyết định “đúng đắn” trong khi thực tế họ có thể đưa ra những quyết định gây hậu quả khủng khiếp. Hoặc những quyết định đó có thể không gây ra hậu quả kinh doanh khủng khiếp, nhưng đó là điểm mấu chốt. khi bạn bỏ qua những cân nhắc kinh doanh trong khi đưa ra quyết định, hậu quả kinh doanh sẽ là ngẫu nhiên và hơi khó đoán. Điều đó thật xấu

Một thực tế đơn giản là các vấn đề kinh doanh chi phối các vấn đề kỹ thuật và bất kỳ định nghĩa nào về “tốt” mà không thừa nhận thực tế đó đều là xấu

Tôi nên nói gì với những người phàn nàn rằng từ “FAQ” gây hiểu nhầm, rằng nó nhấn mạnh câu hỏi hơn là câu trả lời và rằng tất cả chúng ta nên bắt đầu sử dụng một từ viết tắt khác?

Nói với họ để lớn lên

Một số người muốn thay đổi từ “FAQ” thành một từ viết tắt khác, chẳng hạn như điều gì đó nhấn mạnh câu trả lời hơn là câu hỏi. Tuy nhiên, một từ hoặc cụm từ được xác định bởi cách sử dụng của nó. Nhiều người đã hiểu “FAQ” như một từ theo đúng nghĩa của nó. Hãy nghĩ về nó như một biệt danh cho một ý tưởng hơn là một từ viết tắt. Như một từ, "Câu hỏi thường gặp" đã có nghĩa là một danh sách các câu hỏi và câu trả lời phổ biến

Đừng coi đây là một sự khuyến khích để sử dụng các từ một cách cẩu thả. Hoàn toàn ngược lại. Vấn đề là giao tiếp rõ ràng liên quan đến việc sử dụng những từ mà mọi người đã hiểu. Tham gia vào một cuộc tranh luận về việc liệu chúng ta có nên thay đổi từ “FAQ” hay không là ngớ ngẩn và lãng phí thời gian. Sẽ là một chuyện nếu từ này chưa được nhiều người biết đến, nhưng nó không còn có ý nghĩa sau khi rất nhiều người đã hiểu nó

Một sự tương tự (không hoàn hảo). ký tự

template
void draw_all(C& cs)    // draw each element of a standard container
{
    for_each(cs.begin(),cs.end(),[](Shape* p){ p->draw(); });
}
3 hầu như được biết đến rộng rãi là ký tự cấp dòng, tuy nhiên rất ít lập trình viên ngày nay làm việc với các máy tính được trang bị máy đánh chữ điện báo thực sự thực hiện “việc cấp dòng. ” Không ai quan tâm nữa; . Và
template
void draw_all(C& cs)    // draw each element of a standard container
{
    for_each(cs.begin(),cs.end(),[](Shape* p){ p->draw(); });
}
4 là dấu xuống dòng, mặc dù máy tính của bạn có thể không có dấu xuống dòng. Sống với nó

Một sự tương tự (không hoàn hảo) khác là. Nhờ công trình xuất sắc của Andy Koenig, , và những người khác, cái tên “RAII” đã trở nên rất nổi tiếng trong cộng đồng C++. “RAII” đại diện cho một và bạn nên. Tuy nhiên, nếu bạn phân tích “RAII” là một từ viết tắt và nếu bạn (cũng vậy?) nhìn kỹ vào các từ tạo nên từ viết tắt đó, bạn sẽ nhận ra rằng các từ này không phù hợp hoàn hảo với khái niệm này. Ai quan tâm?. ?

Thông tin chi tiết. Nếu bạn mổ xẻ các từ của từ viết tắt RAII (Resource Acquisition Is Initialization), bạn sẽ nghĩ RAII là về việc thu thập tài nguyên trong quá trình khởi tạo. Tuy nhiên, sức mạnh của RAII không đến từ việc ràng buộc mua lại với khởi tạo, mà từ việc ràng buộc khai hoang với phá hủy. Một từ viết tắt chính xác hơn có thể là RRID (Resource Reclamation Is Destruction), có thể là DIRR (Destruction Is Resource Reclamation), nhưng vì rất nhiều người đã hiểu RAII nên việc sử dụng nó đúng cách quan trọng hơn nhiều so với việc phàn nàn về thuật ngữ này. RAII là biệt danh cho một ý tưởng;

(Điều thực sự quan trọng trong các từ viết tắt là chúng nghe hay ho như thế nào. Do đó, rõ ràng “RRID” và “DIRR” tốt hơn. Đùa thôi. )

Vì vậy, hãy coi từ “FAQ” là một biệt danh đã có ý nghĩa lâu đời và được nhiều người biết đến. Một từ được xác định bởi cách sử dụng của nó

Làm cách nào tôi có thể giúp làm cho Câu hỏi thường gặp về C++ trở nên tốt hơn nữa??. ??

Vui lòng gửi tài liệu có đề xuất hoặc thậm chí bạn muốn tình nguyện để được phê duyệt làm người duy trì Câu hỏi thường gặp để tự đóng góp khi bạn có thời gian. Tình nguyện viên có trình độ được đánh giá cao

Nếu bạn muốn giúp đỡ, đây là một số chi tiết cụ thể

  1. Đừng mong được trả tiền

    Đây là một công việc tình yêu không được trả công - đối với tôi, và, nếu bạn chọn giúp đỡ, đối với bạn

    Trả lại là một điều tốt. Công nghệ đã tốt với tôi và tôi mong nó cũng tốt với bạn

  2. Một giải pháp hiệu quả (câu hỏi thường gặp + câu trả lời) sẽ được tích hợp nhanh hơn so với đề xuất một lần để người khác viết lên

    • template
      void draw_all(C& cs)    // draw each element of a standard container
      {
          for_each(cs.begin(),cs.end(),[](Shape* p){ p->draw(); });
      }
      
      5 ← Ưu tiên
    • template
      void draw_all(C& cs)    // draw each element of a standard container
      {
          for_each(cs.begin(),cs.end(),[](Shape* p){ p->draw(); });
      }
      
      6 ← Sẽ lâu hơn

    Chúng tôi sẽ cố gắng (và luôn cố gắng) để đi đến phần sau, mặc dù chúng tôi chỉ có rất nhiều thời gian.

  3. Đừng lo lắng nếu bạn viết dở. Vẫn gửi ý tưởng của bạn. Chúng tôi sẵn sàng chỉnh sửa từ ngữ những gì bạn gửi, vừa để làm cho nó “phù hợp” với phần còn lại của Câu hỏi thường gặp vừa để giúp bạn dễ dàng thực hiện

    Vì vậy, hãy gửi đề xuất của bạn, ngay cả khi bạn không tự tin vào khả năng viết của mình

  4. Liên kết bên ngoài chết. Thở dài. Có quá nhiều người trong số họ. Nếu bạn tìm thấy, nó sẽ rất hữu ích (cho toàn bộ cộng đồng C++. ) nếu bạn gửi đúng URL đã cập nhật

    Rõ ràng là chúng tôi đánh giá cao bất kỳ trợ giúp nào, ngay cả khi điều duy nhất bạn nói với chúng tôi là liên kết đã chết. Tuy nhiên, nếu bạn làm điều đó, hãy lưu ý rằng liên kết sẽ chỉ bị xóa — liên kết có thể sẽ không được sửa chữa

    Chi phí chức năng trong C là gì?

    Trong khoa học máy tính, chi phí chung là bất kỳ sự kết hợp nào của thời gian tính toán, bộ nhớ, băng thông hoặc các tài nguyên khác dư thừa hoặc gián tiếp cần thiết để thực hiện một tác vụ cụ thể. It is a special case of engineering overhead.

    C có tối ưu hơn C++ không?

    C++ nhanh hơn C . Ít nhất, viết mã nhanh bằng C ++ dễ dàng hơn bằng C ngày nay. Trên thực tế, ngày nay, C ++ là ngôn ngữ được lựa chọn để tối ưu hóa, không phải C cũ đơn thuần. Lý do nó rất hiệu quả là gấp đôi.

    C nhanh hơn bao nhiêu so với CPP?

    Mã giống nhau trong C và C++ thường chạy ở tốc độ chính xác như nhau , ngoại trừ mã có ngữ nghĩa khác nhau do quy tắc răng cưa khác nhau, v.v. Sự khác biệt giữa thành ngữ C và thành ngữ C++.

    Sự khác biệt giữa C và C# là gì?

    Ngôn ngữ C hỗ trợ lập trình thủ tục. Trong khi C# hỗ trợ lập trình hướng đối tượng .