Containers are all classes defined in the STL!
1. Struct
A struct simply feels like an open pile of bits with very little in the way of encapsulation(封装) or functionality. A class feels like a living and responsible member of society with intelligent services, a strong encapsulation barrier, and a well defined interface. —Bjarne Stroustrup
Issues of struct
- Pubilc access to all internal state data by default.
- Users of struct need to explicitly(明确的) initialize each data member.
2. Class
Class is a programmer-defined custom type, an abstraction of an object or data type. It provides their users with a public interface and spearate this from a private implementation.
Header file
1 | // student.h |
Private section:
- Usually contains all member variavles.
- Users can’t access or modify anything in the private section.
Public section:
- Users of the Student object can directly access anything here!
- Defines interface for interacting with the private member variavles.
.cpp file
1 |
|
Namespaces
- Put code into logical groups, to avoid name clashes(冲突).
- Each class has its own namespace.
- Syntax for calling/using something in a namespace is
namespace_name::name
Function definitions with namespaces! std::string Student::getName(){...}
namespace_name::name
in s function prototype(原型) means “this is the implementation for an interface function innamespace_name
“.- Inside the
{...}
the private member variables fornamespace_name
will be in scope(范围)!
The this
keyword! this->element_name
means “the item in this Student object with name element_name”. Use this
can avoid for naming conflicts.
1 | void Student::setName(string name){ |
Constructors
Constructors define how the member variavles of an object is initialized. It gets called when you first create a Student object. And it is overloadable!
1 | Student::Student(){...} |
Destructors
Destructors define how to deallocate the memory we allocate. The destructor is defined using
Class_name::~Class_name()
. No one ever explicitly calls it! It’s called whenClass_name
object go out of scope.
3. Template classes
Fundamental Theorem of Software Engineering: Any problem can be solved by adding enough layers of indirection.
What if we don’t want to write a class for every type we can think of? The solution is using Template Classes!
Template Class: A class that is parametrized(参数化) over some number of types. A class that is comprised(包括) of member variables of a general type/types.
Template classes you’ve used!
Vectors: vector<int> intVec
and vector<string> strVec;
Maps: map<int, string> int2Str
and map<int, int> int2Int
Pretty much all containers!
Syntax writing a template class
Use generic typenames as placeholders!
Template struct:
1 | template<struct First, struct Second> struct MyPair{ |
Template class:
Decleration and defination are in one .h file:
1 | // myPair.h |
Declaration is in .h file, while defination in .cpp file:
1 | // myPair.h |
1 | // myPair.cpp |
However, when we want to declare a MyPair<int,int>
in main.cpp, and use the below command to compile and link these files, we get a comile error: undefined reference to MyPair<int,int>::setFirst(int)
. WHY??
1 | // main.cpp |
1 | g++ -c myPair.cpp main.cpp |
g++ -c myPair.cpp main.cpp
compile and create all the code in myPair.cpp and main.cpp. All the functions in myPair.h have implementations that have been compiled now, and main can access them because it included myPair.h.
In main.cpp, when compiler comes into code MyPair<int,int>
, it will conpile all that code and can access to myPair.h right now! However, all it have access to is vector.h, there is no implementation for the interface in that file! And it can’t go looking for myPair.cpp.
So we should put the implementation of functions in the myPair.h, but can’t simply use #include "myPair.cpp"
in myPair.h. Because in myPair.cpp, we have already include the myPair.h.
Templates don’t emit code until instantiated(实例化), so include the implementation of functions in .h file.
- 本文作者: 夏花
- 本文链接: http://xiahua19.github.io/2022/07/25/cs106l-7-Class/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!