Nội dung bài viết
Lê Minh Trung Bên cạnh những kiểu dữ liệu có sẵn như char, int, float,… C++ cũng cho phép các lập trình viên tự định nghĩa kiểu dữ liệu để phù hợp với mục đích cũng như tạo mã nguồn tối ưu nhất. Bài viết này sẽ tiếp tục trình bày về kiểu dữ liệu người dùng tự định nghĩa là struct và union.

Giới thiệu

Bên cạnh những kiểu dữ liệu có sẵn như char, int, float,… C++ cũng cho phép các lập trình viên tự định nghĩa kiểu dữ liệu để phù hợp với mục đích cũng như tạo mã nguồn tối ưu nhất. Bài viết này sẽ tiếp tục trình bày về kiểu dữ liệu người dùng tự định nghĩa là struct và union.

Tiền đề bài viết

Tiếp nối bài viết typedef và enum, tôi mong muốn giới thiệu nhiều hơn đến bạn đọc một số kiểu dữ liệu tự định nghĩa khác trong C++.

Đối tượng hướng đến

Bài viết hướng đến những lập trình viên mới bắt đầu tiếp xúc và làm việc với những kiểu dữ liệu tự định nghĩa trong C++. Bên cạnh đó, bài viết sẽ trình bày theo cấu trúc của ngôn ngữ C++ vì thế đòi hỏi bạn có kiến thức về ngôn ngữ này.

struct

Định nghĩa

Struct là một tập hợp các phần tử dữ liệu cùng kiểu hoặc khác kiểu được gộp chung thành một nhóm. Các phần tử này được gọi là thành viên của struct.

Cú pháp

struct <Tên struct>
{
<Kiểu dữ liệu thành viên số 1> <Tên thành viên số 1>;
<Kiểu dữ liệu thành viên số 2> <Tên thành viên số 2>;
…
};

Ví dụ

struct Subject
{
	string	m_name_subject;
	string	m_pre_subject;
	int		m_hour_per_week;
	string	m_trainer;
};

Sử dụng struct

  • Để truy cập vào các thành viên của struct ta sử dụng toán tử dấu chấm (.)đặt giữa tên biến kiểu struct và tên thành viên của struct cần truy cập.

  • Một biến thuộc kiểu struct cũng có thể trở thành tham số của một hàm.

  • Có thể truy cập thành phần của struct thông qua biến con trỏ.

Để rõ hơn, các bạn có thể theo dõi đoạn mã nguồn dưới đây:

#include <iostream>
#include <string>
using namespace std;

/*Declare a struct called Subject*/
struct Subject
{
	string	m_name_subject;			//delare member types
	string	m_pre_subject;
	int		m_hour_per_week;
	string	m_trainer;
};

void PrintSubjectInformation(Subject object)
{
	cout << object.m_name_subject		<< endl;
	cout << object.m_trainer		<< endl;
	cout << object.m_hour_per_week	<< endl;
	cout << object.m_pre_subject		<< endl;
}

int main()
{
	Subject subject;

	// Access the member of struct Subject through subject
	subject.m_name_subject	= "Game Programming";
	subject.m_pre_subject	= "Basic Programming";
	subject.m_hour_per_week = 4;
	subject.m_trainer		= "Brian Vu";

	PrintSubjectInformation(subject);

	return 0;
}

union

Định nghĩa

Cũng giống như struct, union là một tập hợp các phần tử dữ liệu cùng kiểu hoặc khác kiểu được gộp chung thành một nhóm. Các phần tử này được gọi là thành viên của union

Cú pháp

union <Tên struct>
{
<Kiểu dữ liệu thành viên số 1> <Tên thành viên số 1>;
<Kiểu dữ liệu thành viên số 2> <Tên thành viên số 2>;
…
};

Ví dụ

union <Tên struct>
{
<Kiểu dữ liệu thành viên số 1> <Tên thành viên số 1>;
<Kiểu dữ liệu thành viên số 2> <Tên thành viên số 2>;
…
};

Sử dụng union

  • Để truy cập vào các thành viên của union ta sử dụng toán tử dấu chấm (.)đặt giữa tên biến kiểu union và tên thành viên của union cần truy cập.

  • Một biến thuộc kiểu union cũng có thể trở thành tham số của một hàm.

  • Có thể truy cập thành viên của union thông qua biến con trỏ.

Để rõ hơn, các bạn có thể theo dõi đoạn mã nguồn dưới đây:

#include <iostream>

using namespace std;

/* Declare */
union Post
{
	int		m_iValue;
	float		m_fValue;			//delare member types
	long		m_lValue;
};

void PrintSubjectInformation(Post post)
{
	cout << post.m_iValue	<< endl;
	cout << post.m_fValue	<< endl;
	cout << post.m_lValue	<< endl;
}

int main()
{
	Post post;
	post.m_iValue		= 169;			// Access the member of union
	post.m_fValue		= 39.01;
	post.m_lValue		= 123;

	PrintSubjectInformation(post);

	return 0;
}

Output

ss_1

Khi thay đổi giá trị post.m_lValue = 123;. Ta đã làm ảnh hướng đến giá trị của các thành viên còn lại. Điều này sẽ được giải thích ở phần sau.

So sánh struct và union

Về mặt ý nghĩa, struct và union cơ bản giống nhau. Tuy nhiên, về mặt lưu trữ trong bộ nhớ, chúng có sự khác biệt rõ rệt như sau:

  • struct: Dữ liệu của các thành viên của struct được lưu trữ ở những vùng nhớ khác nhau. Do đó kích thước của một struct chắc chắn lớn hơn kích thước của các thành viên cộng lại.

Tại sao lại lớn hơn kích thước của thành viên?

Lý do

Tùy thuộc và kích thước của khối nhớ do hệ thống quy định.

Ví dụ

Hệ thống quy định khối nhớ là 1 byte, thì kích thước của kiểu dữ liệu sSinhVien là 13 bytes.

struct sSinhVien
{
	char	m_id[5];
	float	m_height;
	float	m_weight;
};

ss_2

*Nói thêm: thực tế struct trên nếu lấy kích thước thông thường sẽ có "hiệu ứng" Alignment nên kích thước sẽ không phải là 13 bytes, do bài viết này dành cho các bạn mới bắt đầu nên ta sẽ không bàn sâu về vấn đề này, các bạn muốn hiểu thêm có thể đọc thêm bài Struct Alignment Trong C++.

  • union: với union, các thành viên sẽ dùng chung một vùng nhớ. Kích thước của union được tính là kích thước lớn nhất của kiểu dữ liệu trong union. Việc thay đổi nội dung của một thành viên sẽ dẫn đến thay đổi nội dung của các thành viên khác.

ss_3

THẢO LUẬN
ĐÓNG