sizeof()
a char*
pointer's size is fixed at 4 bytes (on 32-bit system, and double it on 64-bit) and is independent of the volume of data being pointed to.
declaring a friend
of a class
a friend
keyword used in external classes of functions have access to data declared private
.
e.g. using the friend
keyword to allow an external function to access to private
data members.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include <iostream> #include <string> using namespace std;class Human { private : friend void DisplayAge (const Human &person) ; int age; string name; public : Human (string humanName, int humanAge) : name (humanName), age (humanAge) {} }; void DisplayAge (const Human &person) { cout << person.age << endl; } int main () { Human ManTom ("Tom" , 20 ) ; DisplayAge (ManTom); return 0 ; }
enumeration
Enumerated type is a user defined data type also named as enumerator type.
syntax
1 2 3 4 enum enumName { value1,value2,...,valueN }urName
Defining enumerator type enumName
, meanwhile, define it's variable urName
. Otherwise, using it as follow:
syntax
1 2 3 4 enum DAY { MON=1 , TUE, WED, THU, FRI, SAT, SUN } day;
Use ::
for scoped enumerations
quote here: other scope resolution operator usages
1 2 3 4 5 6 7 8 9 enum class EnumA { First, Second, Third }; int main () { EnumA enum_value = EnumA::First; }
differences of enum
and enum class
quote here: Why is enum class preferred over plain enum?
C++ has two kinds of enum
what's the difference of the two?
enum class
- enumerator names are local to the enum
and their values are not implicitly convert to other types (like other enum
or int
)
plain enum
where enumerators are in the same scope as the enum
and their values implicitly convert to integers
and other types.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 enum Color { red, green, blue }; enum Card { red_card, green_card, yellow_card }; enum class Animal { dog, deer, cat, bird, human }; enum class Mammal { kangaroo, deer, human }; void fun () { Color color = Color::red; Card card = Card::green_card; int num = color; if (color == Card::red_card) cout << "bad" << endl; if (card == Color::green) cout << "bad" << endl; Animal a = Animal::deer; Mammal m = Mammal::deer; int num2 = a; if (m == a) cout << "bad" << endl; if (a == Mammal::deer) cout << "bad" << endl; }
Another Example
1 2 enum class Animal {Dog, Cat, Tiger};enum class Pets {Dog, Parrot};
Here we can not mix Animal and Pets values.
1 2 Animal a = Dog; Animal a = Pets::Dog
Further
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #include <iostream> using namespace std;enum class Color { Red, Green, Blue }; void printColor (Color color) { switch (color) { case Color::Red: cout << "The color is red." << endl; break ; case Color::Green: cout << "The color is green." << endl; break ; case Color::Blue: cout << "The color is blue." << endl; break ; default : cout << "The color is unknown." << endl; break ; } } int main () { printColor (Color::Red); printColor (Color::Green); printColor (Color::Blue); return 0 ; }
difference between <string>
and <string.h>
<string.h>
contains old functions like strcpy
, strlen
for C style null-terminated strings.
<string>
primarily contains the std::string
, std::wstring
and other classes.
All in one
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 #include <iostream> #include <string.h> using namespace std;union SimpleUnion { int num; char alphabet; }; struct ComplexType { enum DataType { Int, Char } type; union Value { int num; char alphabet; Value (){}; ~Value (){}; } value; }; void DisplayComplexType (const ComplexType &obj) { switch (obj.type) { case ComplexType::Int: cout << "unions contain number is " << obj.value.num << endl; break ; case ComplexType::Char: cout << "unions cantain number is " << obj.value.alphabet << endl; break ; } }; int main () { SimpleUnion u1, u2; u1.num = 1000 ; u2.alphabet = 'a' ; cout << "sizeof(u1) containing integer " << sizeof (u1) << endl; cout << "sizeof(u2) containing character " << sizeof (u2) << endl; ComplexType myData1, myData2; myData1.type = ComplexType::Int; myData1.value.num = 1000 ; myData2.type = ComplexType::Char; myData2.value.alphabet = 'A' ; DisplayComplexType (myData1); DisplayComplexType (myData2); return 0 ; }
Analysis
The sample demonstrates that sizeof()
the union objects u1
and u2
returns the same amount of memory reserved for both objects, notwithstanding the fact that u1
is used to hold an integer
and u2
a char
, char
being smaller than an int
. This is because the compiler reserves the amount of memory for a union that is consumed by the largest object it contains.
Title: union and struct
Categories: Coding
Tags: CPP