- Hands-On System Programming with C++
- Dr. Rian Quinn
- 601字
- 2021-07-02 14:42:29
Objects of C++
Although C++ supports object-oriented programming with built-in constructs, object-oriented programming is a design pattern that is often used in C as well, and in POSIX in general. Take the following example:
/* Example: C */
struct point
{
int x;
int y;
};
void translate(point *p; int val)
{
if (p == NULL) {
return;
}
p->x += val;
p->y += val;
}
In the preceding example, we have a struct that stores a point{}, which contains x and y positions. We then offer a function that is capable of translating this point{} in both the x and y positions, using a given value (that is, a diagonal translation).
There are a couple of notes with respect to this example:
- Often, people will claim to dislike object-oriented programming, but then you see this sort of thing in their code, which is, in fact, an object-oriented design. The use of class isn't the only way to create an object-oriented design. The difference with C++ is that the language provides additional constructs for cleanly and safely working with objects, while with C this same functionality must be done by hand—a process that is prone to error.
- The translate() function is only related to the point{} object because it takes a point{} as a parameter. As a result, the compiler has no contextual information to understand how to manipulate a point{} struct, without translate() being given a pointer to it as a parameter. This means that every single public-facing function that wishes to manipulate a point{} struct must take a pointer to it as its first parameter, and verify that the pointer is valid. Not only is this a clunky interface, it's slow.
In C++, the preceding example can be written as the following:
// Example: C++
struct point
{
int x;
int y;
void translate(int val)
{
p->x += val;
p->y += val;
}
};
In this example, a struct is still used. The only difference between a class and a struct in C++ is that all variables and functions are public by default with a struct, while they are private by default with a class.
The difference is that the translate() function is a member of point{}, which means it has access to the contents of its structure, and so no pointers are needed to perform the translation. As a result, this code is safer, more deterministic, and easier to reason about, as there is never the fear of a null dereference.
Finally, objects in C++ provide construction and destruction routines that help prevent objects from not being properly initialized or properly deconstructed. Take the following example:
// Example: C++
struct myfile
{
int fd{0};
~myfile() {
close(fd);
}
};
In the preceding example, we create a custom file object that holds a file descriptor, often seen and used when system programming with POSIX APIs.
In C, the programmer would have to remember to manually set the file descriptor to 0 on initialization, and close the file descriptor when it is no longer in scope. In C++, using the preceding example, both of these operations would be done for you any time you use myfile.
This is an example of the use of Resource Acquisition Is Initialization (RAII), a topic that will be discussed in more detail in Chapter 4, C++, RAII, and the GSL Refresher, as this pattern is used a lot by C++. We will leverage this technique when system programming to avoid a lot of common POSIX-style pitfalls.
- 企業數字化創新引擎:企業級PaaS平臺HZERO
- SQL Server 2008數據庫應用技術(第二版)
- 區塊鏈通俗讀本
- WS-BPEL 2.0 Beginner's Guide
- 數字媒體交互設計(初級):Web產品交互設計方法與案例
- Python金融實戰
- Hands-On Mathematics for Deep Learning
- 金融商業算法建模:基于Python和SAS
- INSTANT Apple iBooks How-to
- 達夢數據庫運維實戰
- 活用數據:驅動業務的數據分析實戰
- 區塊鏈+:落地場景與應用實戰
- 大數據數學基礎(R語言描述)
- Scratch 2.0 Game Development HOTSHOT
- Cognitive Computing with IBM Watson