Computer >> Máy Tính >  >> Lập trình >> C ++

Tính năng mới của C ++ 17

Ủy ban Tiêu chuẩn C ++ luôn tập trung vào việc cung cấp các tính năng mới ba năm một lần. Hai phần chính của đặc tả là chức năng cốt lõi của ngôn ngữ lập trình và Thư viện mẫu chuẩn (STL). Các tính năng mới được giới thiệu để làm cho mã sạch hơn, dễ dàng hơn và nhỏ gọn hơn. Sau đây là danh sách các tính năng được giới thiệu-:

1. Biểu thức gấp

Biểu thức gấp được sử dụng để viết mã ngắn hơn cho một số lượng biến đối số có thể được truyền cho một hàm hoặc có thể được trả về từ hàm. Nó cho phép sử dụng bất kỳ số lượng biến nào làm đối số và trả lại các câu lệnh của một hàm.

Cú pháp:-

  • Màn hình đầu tiên bên phải - (pack op1 ...)

  • Màn hình đầu tiên bên trái - (… gói op1)

  • Màn hình đầu tiên bên trái nhị phân - (init op1… op1 pack)

  • Màn hình đầu tiên bên phải nhị phân - (pack op1… op1 init)

Đây gói là một gói tham số có thể được mở rộng cho bất kỳ số lượng biến nào. op1 là một nhà điều hành. (-, +, <=,> =, <,>, ==, *, /….). Trong các nếp gấp nhị phân, cả op1 đều là các toán tử giống nhau.

init là một biểu thức không thể mở rộng.

Ví dụ

#include <iostream>
#include <string>
using namespace std;
template<typename ...Args> auto addition(Args ...args){
   return (args + ... + 0);
}
template<typename ...Args> auto sum2(Args ...args){
   return (args + ...);
}
int main(){
   cout << "Sum is : "<<addition(1,1,1,1,1) << endl;
   cout << "Sum 2 is : "<<addition ( 1,2,3);
}

Đầu ra

Sum is : 5
Sum 2 is : 6

2. Ràng buộc cấu trúc

Chúng được sử dụng để khai báo nhiều biến sẽ được khởi tạo với các giá trị trong một cặp, bộ, v.v. Tất cả những ràng buộc của các biến với bộ khởi tạo được thực hiện trong một câu lệnh duy nhất.

  • Trường hợp 1:- ràng buộc một mảng

    Mỗi mã định danh trong danh sách mã định danh trở thành tên của giá trị giá trị cho phần tử của mảng. Số phần tử phải bằng số lượng định danh.

    int arry [3] ={3,4,5};

    auto [a, b, c] =arry;

    // ở đây mảng được tạo và a tham chiếu đến 3, b tham chiếu đến 4 và c tham chiếu đến 5.

  • Trường hợp 2:- ràng buộc một loại tuple like

    float fnum {};

    char ch1 {};

    số int {};

    std ::tuple tplex (fnum, std ::move (ch1), number);

    const auto &[p, q, r] =tplex;

    // p là tên của ràng buộc có cấu trúc tham chiếu đến fnum

    // q là tên của ràng buộc có cấu trúc tham chiếu đến ch1

    // r là tên của ràng buộc có cấu trúc đề cập đến số

  • Trường hợp 3:- ràng buộc với các thành viên dữ liệu

    struct structVar {

    int num1:2 có thể thay đổi;

    num2 dễ bay hơi;

    };

    structVar func ();

    const auto [a, b] =func ();

    // a là giá trị int cho trường bit 2 bit

    // b là giá trị kép const biến động

3. Khởi tạo enums bằng Danh sách Trực tiếp

Với C ++ 17, enum bây giờ có thể được khởi tạo bằng cách sử dụng dấu ngoặc nhọn.

Cú pháp:-

enum byte : unsigned char {};
byte b0 {0}; // OK
byte b1 = byte{1}; // OK
byte b2 = byte{256}; // ERROR - 0 to 255 only

4. Khai báo biến bên trong If và Switch

C ++ 17 cho phép khai báo các biến bên trong điều kiện if và switch. Điều này giúp bạn dễ dàng sử dụng các biến có cùng tên nhưng có phạm vi khác nhau.

Cú pháp:-

if (data type variable condition)
{
   //statements
}
switch ( condition; variable )
{
   //statements
}

5. Câu lệnh if constexpr

Tính năng hữu ích cho mã mẫu. Câu lệnh if constexpr được đánh giá tại thời điểm biên dịch.

Nó như thế nào

Sự hữu ích có thể được hiển thị bằng cách sử dụng các so sánh dưới đây:-

Các câu lệnh If-else chung:-

int var = 10;
if (var >= 10) {
   var=var+10;
} else {
   var=var-10;
}

Constexpr Câu lệnh If-else:-

template <typename T>
auto length ( T const& value ) { 
   //checking if T is integer or not
   if (is_integral<T>::value) {
      return value;
   } else {
      return value.length();
   }
}

6. Không gian tên lồng nhau

Không gian tên được sử dụng để nhóm các mã tương tự lại với nhau như các lớp và chức năng có tương quan với nhau. C ++ 17 cho phép sử dụng các không gian tên lồng nhau về cú pháp dễ dàng hơn. Trước đó cú pháp khá lộn xộn khi số lượng không gian tên lồng nhau nhiều hơn. Việc xử lý niềng răng bây giờ không còn cần thiết nữa.

Trước C ++ 17:-

namespace Earth{

   namespace Continent {
      namespace Country {
         class City {
         ..........
}; } } }

Cú pháp mới:-

namespace Earth :: Continent :: Country {
   class City {
      ..........
}; }