Bạn đang xem bài viết Lớp Lưu Trữ (Storage Class) Trong C/C++ được cập nhật mới nhất trên website 2atlantic.edu.vn. Hy vọng những thông tin mà chúng tôi đã chia sẻ là hữu ích với bạn. Nếu nội dung hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất.
Lớp lưu trữ auto trong C/C++
Lớp lưu trữ auto trong C/C++ là lớp lưu trữ mặc định cho tất cả biến cục bộ trong C/C++:
{ int diemthi; auto int diemthi; }Ví dụ trên định nghĩa hai biến với cùng lớp lưu trữ, auto chỉ có thể được sử dụng bên trong các hàn, ví dụ: cho các biến nội bộ.
Lớp lưu trữ register trong C/C++
Lớp lưu trữ register trong C/C++ được sử dụng để định nghĩa các biến cục bộ mà nên được lưu giữ trong một thanh ghi thay vì RAM. Nghĩa là, biến có kích cỡ tối đa bằng với kích cỡ thanh ghi (thường là 1 từ) và không thể có toán tử một ngôi ‘&’ được áp dụng tới nó (vì không có địa chỉ bộ nhớ).
{ register int hocphi; }Lớp lưu trữ register nên chỉ được dùng cho các biến yêu cầu truy cập nhanh như các biến đếm (counters). Cũng cần chú ý rằng, một biến định nghĩa với ‘register’ không có nghĩa là biến đó được lưu trữ trong thanh ghi. Tức là nó có thể được lưu trữ trong thanh ghi phụ thuộc vào phần cứng và giới hạn thực thi.
Lớp lưu trữ static trong C/C++
Lớp lưu trữ static trong C/C++ nói với compiler để giữ một biến cục bộ tồn tại trong toàn bộ thời gian sống của chương trình thay vì tạo và hủy biến mỗi lần nó vào và ra khỏi phạm vi biến. Vì vậy, các biến có static cho phép nó duy trì giá trị giữa các lần gọi hàm.
Lớp lưu trữ static cũng có thể được áp dụng cho các biến toàn cục (global). Khi áp dụng cho biến toàn cục, nó nói với trình biên dịch rằng, phạm vi của biến toàn cục bị giới hạn trong tập tin mà nó được khai báo.
Trong C/C++, khi static được sử dụng trên thành viên dữ liệu của lớp, nó gây ra: chỉ có một bản sao của thành viên đó được chia sẻ bởi tất cả đối tượng trong lớp của nó.
Chạy chương trình C/C++ trên sẽ cho kết quả như sau:
i co gia tri la 6 va bien_dem co gia tri la 9 i co gia tri la 7 va bien_dem co gia tri la 8 i co gia tri la 8 va bien_dem co gia tri la 7 i co gia tri la 9 va bien_dem co gia tri la 6 i co gia tri la 10 va bien_dem co gia tri la 5 i co gia tri la 11 va bien_dem co gia tri la 4 i co gia tri la 12 va bien_dem co gia tri la 3 i co gia tri la 13 va bien_dem co gia tri la 2 i co gia tri la 14 va bien_dem co gia tri la 1 i co gia tri la 15 va bien_dem co gia tri la 0Lớp lưu trữ extern trong C/C++
Lớp lưu trữ extern trong C/C++ được dùng để cung cấp một tham chiếu của một biến toàn cục được nhìn thấy bởi TẤT CẢ các file chương trình. Khi bạn sử dụng ‘extern’, biến không thể được khởi tạo, khi nó trỏ tới tên biến tại một vị trí lớp lưu trữ mà đã được định nghĩa trước đó.
Khi bạn có nhiều file và bạn định nghĩa một biến hay hàm toàn cục trong một file và cũng muốn dùng nó trong các file khác, thì extern được dùng trong file khác để cung cấp tham chiếu của biến hay hàm được định nghĩa. Cần nhớ rằng, extern dùng để khai báo một biến hay hàm toàn cục trong file khác.
Lớp lưu trữ extern được dùng phổ biến khi có hai hoặc nhiều file chia sẻ cùng biến hay hàm toàn cục. Xem ví dụ với hai file sau:
File đầu tiên: extern1.cpp
File thứ hai: extern2.cpp
Ở đây, từ khóa extern đang được sử dụng để khai báo biendem trong file khác. Bây giờ biên dịch hai file này như sau:
$g++ chúng tôi chúng tôi -o writeNó sẽ tạo chương trình write có thể thực thi, bạn thử thực thi write và kiểm tra kết quả như sau:
Lớp lưu trữ mutable trong C/C++
Lớp lưu trữ mutable trong C/C++ chỉ áp dụng cho các đối tượng class, sẽ được bàn luận trong chương sau. Nó cho phép một thành viên của một đối tượng để override (ghi đè). Đó là, một thành viên là mutable có thể được sửa đổi bởi một hàm thành viên const.
Theo Tutorialspoint
Bài trước: Modifier trong C/C++
Bài tiếp: Toán tử trong C++
Lớp(Class) Và Đối Tượng Trong C++
Mục đích chính của C++ là bổ sung thêm tính hướng đối tượng (object) cho Ngôn ngữ lập trình C và các Lớp (class) là tính năng trung tâm của C++ mà hỗ trợ lập trình hướng đối tượng và thường được gọi là các kiểu người dùng tự định nghĩa (user-defined).
Một lớp được sử dụng để xác định form của một đối tượng và nó kết nối sự biểu diễn dữ liệu và các phương thức để thao tác các dữ liệu đó vào trong một package gọn gàng. Dữ liệu và hàm bên trong một lớp được gọi là các thành viên của lớp đó.
Định nghĩa Lớp trong C++
Khi bạn định nghĩa một lớp, bạn định nghĩa một blueprint cho một kiểu dữ liệu. Điều này không thực sự định nghĩa bất kỳ dữ liệu nào, nhưng nó định nghĩa ý nghĩa tên lớp là gì, đó là, những gì một đối tượng của lớp đó sẽ bao gồm và những hoạt động nào có thể được thực hiện trên một đối tượng đó.
Một định nghĩa lớp trong C++ bắt đầu với từ khóa class, được theo sau bởi tên lớp và phần thân lớp, được bao quanh trong một cặp dấu ngoặc móc. Một định nghĩa lớp phải được theo sau: hoặc bởi một dấu chấm phảy hoặc một danh sách các khai báo. Ví dụ, chúng ta định nghĩa kiểu dữ liệu Box bởi sử dụng từ khóa class trong C++ như sau:
class Box { public: double chieudai; double chieurong; double chieucao; };Từ khóa public quyết định các thuộc tính truy cập của các thành viên lớp mà theo sau nó. Một thành viên public có thể được truy cập từ bên ngoài lớp bất cứ đâu bên trong phạm vi (scope) của đối tượng lớp đó. Bạn cũng có thể xác định các thành viên của lớp là private hoặc protected sẽ được bàn luận trong chương phụ.
Định nghĩa Đối tượng trong C++
Một lớp cung cấp các blueprint cho các đối tượng, vì thế về cơ bản, một đối tượng được tạo từ một lớp. Chúng ta khai báo các đối tượng của một lớp giống đúng như chúng ta khai báo các biến của kiểu cơ bản. Các lệnh sau khai báo hai đối tượng của lớp Box:
Box Box1; Box Box2;Cả hai đối tượng Box1 và Box2 sẽ có bản sao của các thành viên dữ liệu (Data Member) riêng.
Truy cập các thành viên dữ liệu trong C++
Các thành viên dữ liệu public của các đối tượng của một lớp có thể được truy cập bởi sử dụng toán tử truy cập thành viên trực tiếp là dấu chấm (.). Bạn sẽ thấy rõ ràng khi xem ví dụ sau:
using namespace std; class Box { public: double chieudai; double chieurong; double chieucao; }; int main( ) { Box Box1; Box Box2; double thetich = 0.0; Box1.chieucao = 4.5; Box1.chieudai = 2.2; Box1.chieurong = 1.5; Box2.chieucao = 3.2; Box2.chieudai = 4.5; Box2.chieurong = 2.3; thetich = Box1.chieucao * Box1.chieudai * Box1.chieurong; cout << "The tich cua Box1 la: " << thetich <<endl; thetich = Box2.chieucao * Box2.chieudai * Box2.chieurong; cout << "The tich cua Box2 la: " << thetich <<endl; return 0; }Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:
Điểm quan trọng cần nhớ là: các thành viên private và protected không thể được truy cập một cách trực tiếp bởi sử dụng toán tử truy cập thành viên trự tiếp này. Chúng ta sẽ học cách các thành viên private và protected có thể được truy cập.
Chi tiết về Lớp & Đối tượng trong C++
Hàm friend được cho phép truy cập tới các thành viên là private và protected của một lớp
Mỗi đối tượng có một con trỏ this đặc biệt, mà trỏ tới chính đối tượng đó
Đã có app VietJack trên điện thoại, giải bài tập SGK, SBT Soạn văn, Văn mẫu, Thi online, Bài giảng….miễn phí. Tải ngay ứng dụng trên Android và iOS.
Theo dõi chúng tôi miễn phí trên mạng xã hội facebook và youtube:
Các bạn có thể mua thêm khóa học JAVA CORE ONLINE VÀ ỨNG DỤNG cực hay, giúp các bạn vượt qua các dự án trên trường và đi thực tập Java. Khóa học có giá chỉ 300K, nhằm ưu đãi, tạo điều kiện cho sinh viên cho thể mua khóa học.
Nội dung khóa học gồm 16 chuơng và 100 video cực hay, học trực tiếp tại https://www.udemy.com/tu-tin-di-lam-voi-kien-thuc-ve-java-core-toan-tap/ Bạn nào có nhu cầu mua, inbox trực tiếp a Tuyền, cựu sinh viên Bách Khoa K53, fb: https://www.facebook.com/tuyen.vietjack
Follow facebook cá nhân Nguyễn Thanh Tuyền https://www.facebook.com/tuyen.vietjack để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile…. mới nhất của chúng tôi.
Bài học C++ phổ biến khác tại vietjack.com:
Template Classes Trong C++ ” Cafedev.vn
Trong hai bài học trước, bạn tìm hiểu cách Các mẫu hàm, và ví dụ, cho phép chúng ta khái quát các hàm để làm việc với nhiều kiểu dữ liệu khác nhau. Mặc dù đây là một khởi đầu tuyệt vời cho con đường lập trình tổng quát, nhưng nó không giải quyết được tất cả các vấn đề của chúng ta. Chúng ta hãy xem một ví dụ về một vấn đề như vậy và xem những mẫu nào có thể giúp thêm cho chúng ta.
1. Mẫu và các lớp container
Bạn đã học cách sử dụng thành phần để triển khai các lớp có chứa nhiều phiên bản của các lớp khác. Như một ví dụ về một container, chúng ta đã xem xét lớp IntArray. Đây là một ví dụ đơn giản về lớp đó:
Trong khi lớp này cung cấp một cách dễ dàng để tạo các mảng số nguyên, nếu chúng ta muốn tạo một mảng double thì sao? Sử dụng các phương pháp lập trình truyền thống, chúng ta phải tạo ra một lớp hoàn toàn mới! Đây là một ví dụ về DoubleArray, một lớp mảng được sử dụng để giữ số double.
Mặc dù danh sách code dài, nhưng bạn sẽ lưu ý hai lớp gần như giống hệt nhau! Trong thực tế, sự khác biệt đáng kể duy nhất là kiểu dữ liệu được chứa (int so với double). Như bạn có thể đoán, đây là một lĩnh vực khác mà các mẫu có thể được sử dụng tốt, để giải phóng chúng ta khỏi việc phải tạo các lớp bị ràng buộc với một kiểu dữ liệu cụ thể.
Tạo các lớp mẫu hoạt động khá giống nhau để tạo các hàm mẫu, vì vậy chúng ta sẽ tiến hành bằng ví dụ. Đây là lớp mảng của chúng ta, phiên bản templated:
Array.h:
Như bạn có thể thấy, phiên bản này gần giống với phiên bản IntArray, ngoại trừ chúng ta đã thêm khai báo mẫu và thay đổi kiểu dữ liệu được chứa từ int thành T.
Ví dụ này in như sau:
11 11.5 10 10.5 9 9.5 8 8.5 7 7.5 6 6.5 5 5.5 4 4.5 3 3.5 2 2.5 1 1.5 0 0.5Các lớp mẫu được kích hoạt theo cùng một cách các hàm mẫu – trình biên dịch sẽ sao chép một bản sao theo yêu cầu, với tham số mẫu được thay thế bằng kiểu dữ liệu thực tế mà người dùng cần, sau đó biên dịch bản sao. Nếu bạn chưa từng sử dụng một lớp mẫu, trình biên dịch thậm chí sẽ không biên dịch nó.
Các lớp mẫu là lý tưởng để thực hiện các lớp container, bởi vì rất mong muốn các container hoạt động trên nhiều kiểu dữ liệu khác nhau và các mẫu cho phép bạn làm như vậy mà không cần sao chép code. Mặc dù cú pháp là xấu và các thông báo lỗi có thể khó hiểu, các lớp mẫu thực sự là một trong những tính năng hữu ích và tốt nhất của C ++.
2. Các lớp mẫu trong thư viện chuẩn
Một khuôn mẫu không phải là một lớp hoặc một hàm – nó là một mẫu được sử dụng để tạo các lớp hoặc các hàm. Như vậy, nó không hoạt động theo cách tương tự như các hàm hoặc lớp thông thường. Trong hầu hết các trường hợp, đây không phải là một vấn đề. Tuy nhiên, có một lĩnh vực thường gây ra vấn đề cho các developer.
Với các lớp không phải khuôn mẫu, quy trình chung là đặt định nghĩa lớp trong file header và định nghĩa hàm thành viên trong file code .cpp có tên tương tự. Theo cách này, nguồn cho lớp được biên dịch thành một file dự án riêng biệt. Tuy nhiên, với các mẫu, điều này không hoạt động. Hãy xem xét những điều sau đây:
Array.h:
Array.cpp:
main.cpp:
Chương trình trên sẽ biên dịch, nhưng gây ra lỗi liên kết:
unresolved external symbol "public: int __thiscall Array::getLength(void)" (?GetLength@?$Array@H@@QAEHXZ)Có khá nhiều cách để giải quyết vấn đề này.
Cách đơn giản nhất là chỉ cần đặt tất cả code lớp mẫu của bạn vào file header (trong trường hợp này, đặt nội dung của chúng tôi vào Array.h, bên dưới lớp). Theo cách này, khi bạn #include header, tất cả code mẫu sẽ ở một nơi. Mặt trái của giải pháp này là nó đơn giản. Nhược điểm ở đây là nếu lớp mẫu được sử dụng ở nhiều nơi, bạn sẽ kết thúc với nhiều bản sao cục bộ của lớp mẫu, có thể tăng thời gian biên dịch và liên kết của bạn (trình liên kết của bạn nên xóa các định nghĩa trùng lặp, vì vậy không nên phình to thực thi của bạn). Đây là giải pháp ưa thích của chúng ta trừ khi thời gian biên dịch hoặc liên kết bắt đầu trở thành một vấn đề.
Nếu bạn cảm thấy việc đặt code chúng tôi vào header Array.h làm cho tiêu đề quá dài / lộn xộn, một cách khác là đổi tên chúng tôi thành chúng tôi (.inl là viết tắt của dòng), sau đó include chúng tôi từ dưới cùng của Array.h header. Điều đó mang lại kết quả tương tự như việc đặt tất cả code vào tiêu đề, nhưng giúp mọi thứ sạch sẽ hơn một chút.
Một cách khác là sử dụng cách tiếp cận ba tệp. Định nghĩa lớp mẫu đi trong header. Các hàm thành viên lớp mẫu đi trong file code. Sau đó, bạn thêm một tệp thứ ba, chứa tất cả các lớp khởi tạo mà bạn cần:
samples.cpp:
Phương pháp này hiệu quả hơn, nhưng yêu cầu duy trì file chúng tôi cho mỗi chương trình.
Thành Viên Static Của Một Class Trong C#
– Cú pháp khai báo:
– Một số đặc điểm của phương thức khởi tạo tĩnh:
Không được phép khai báo phạm vi truy cập. Nếu khai báo chương trình sẽ báo lỗi khi biên dịch.
Static constructor sẽ được gọi một lần duy nhất khi chương trình được nạp vào bộ nhớ để thực thi như là một cách để ta thiết lập một số thông số theo ý muốn trước khi có bất kỳ đối tượng nào được tạo ra.
Constructor tĩnh cũng giống phương thức tĩnh nên không thể gọi các thuộc tính không phải static.
– Ví dụ: Giả sử bạn có một biến tĩnh colorDay dùng để lưu trữ giá trị màu sắc khác nhau tùy theo thứ của ngày trong tuần, chẳng hạn:
Thứ 2: màu xanh dương
Thứ 3: màu đỏ
Thứ 4: màu tím
Thứ 5: màu hồng
Thứ 6: màu đen
Thứ 7: màu xanh lá
Chủ nhật: màu vàng
– Và bạn muốn khởi tạo giá trị cho biến tĩnh colorDay, nhưng không thể khởi tạo bằng cách gán trực tiếp màu red như sau, vì làm thế thì tất cả các ngày trong tuần đều chỉ cho một màu red:
publicstatic string colorDay= "Red";– Và bạn cũng không thể khởi tạo biến tĩnh colorDay này trong constructor bình thường được. Vì constructor bình thường chỉ được gọi khi có đối tượng được khởi tạo.
– Trường hợp này thì constructor tĩnh là 1 giải pháp đơn giản nhưng hiệu quả.
using System; namespace MinhHoangBlog { class StaticConstructor { static void Main(string[] args) { Console.WriteLine("Màu của ngày hôm này là: " + ColorSample.colorDay); Console.ReadKey(); } } public class ColorSample { public static string colorDay; static ColorSample() { DateTime now = DateTime.Now; switch (now.DayOfWeek) { case DayOfWeek.Monday: colorDay = "Blue"; break; case DayOfWeek.Tuesday: colorDay = "Red"; break; case DayOfWeek.Wednesday: colorDay = "Purple"; break; case DayOfWeek.Thursday: colorDay = "Pink"; break; case DayOfWeek.Friday: colorDay = "Black"; break; case DayOfWeek.Saturday: colorDay = "Green"; break; case DayOfWeek.Sunday: colorDay = "Yellow"; break; } } } }Cập nhật thông tin chi tiết về Lớp Lưu Trữ (Storage Class) Trong C/C++ trên website 2atlantic.edu.vn. Hy vọng nội dung bài viết sẽ đáp ứng được nhu cầu của bạn, chúng tôi sẽ thường xuyên cập nhật mới nội dung để bạn nhận được thông tin nhanh chóng và chính xác nhất. Chúc bạn một ngày tốt lành!