C++面向对象高级编程
C++面向对象的基本知识
weixin_39770712
这个作者很懒,什么都没留下…
展开
-
侯捷C++手把手教学:动态绑定,const用于修饰成员函数
下图是静态绑定,地址是静态的。动态绑定三个条件:指针调用;向上转型;虚函数调用。const包含在函数的签名中,签名是返回类型之后的部分。注意成员函数既有const版本,又有不是const版本时的情况。...原创 2020-10-17 22:02:39 · 182 阅读 · 0 评论 -
侯捷C++手把手教学:this指针实例,结合虚函数
通过对象调用函数,this就是这个对象的地址。CDocument这个父类里面OnFileOpen()常规的操作已经写好了,就是除了Serialize()以外的操作,这里用…代替。子类需要重写Serialize()。这里this是指向子类myDoc的指针,符合三个条件:指针调用,向上转型,调用虚函数,那么路线就会进入子类,调用子类的那个重写过的虚函数。...原创 2020-10-17 01:35:05 · 228 阅读 · 0 评论 -
侯捷C++手把手教学:面试重点(虚函数、多态、动态绑定、虚指针虚表)
虚指针+虚表上述的路线图可用如下代码表示:(*(p->vptr)[n])(p);(*p->vptr[n])(p); //两者等价实现机制:p指向建立的类的对象,只要存在虚函数,就会有虚指针。虚指针占4字节(32位),虚指针指向虚表,虚表记录了所有声明的虚函数的地址(依次记录)。n的值根据虚函数声明的次序。静态绑定:call(****);return …。**是指针,这里是汇编。指针是定死的。动态绑定:需符合三个条件:通过指针调用、指针可以向上转型(父类)、调用的是虚函数。虚函数原创 2020-10-17 01:02:02 · 309 阅读 · 0 评论 -
侯捷C++手把手教学:new()及delete()的重载,标准库例子
new(),delete()的重载第一参数必须是size_t。(placement new)标准库的应用:为了得到reference_counting的功能,计数功能,多少人在共用。记录在Rep里。为了无声无息、不知不觉多分配一些东西。...原创 2020-10-16 22:48:35 · 150 阅读 · 0 评论 -
侯捷C++手把手教学:new delete初探
new、delete作为表达式,他们的行为不能改变,不能重载。分解后的函数(new需要三步,delete需要两步)可以重载。::代表全局。这里要注意范围的问题:若类重载了new与delete,则使用重载了的,否则使用全局的new与delete。编译器传进size_t参数的值,给编译器调用。optional代表选择,写不写这个参数无所谓。第二个多了一个虚函数,有了虚函数就会多一个指针,sizeof值为16。每块内存最上面是一个计数器,指明个数。如size:4表示内存大小为4,但是值为5,代表有原创 2020-10-16 22:08:51 · 263 阅读 · 0 评论 -
侯捷C++手把手教学:reference的变量声明、常见用法(参数传递)
int x=0;int* p=&x;int& r=x; //r代表x。现在r,x都是0int x2=5;r=x2; //r不能重新代表其他变量。现在r,x都是5int& r2=r; //现在r2是5(r2代表r,也相当于代表x)注意:sizeof(r)==sizeof(x);&x==&r;reference常见用途:参数的传递上面。reference是一个对语言用户更友好的指针。void func1(Cls* pobj) { po原创 2020-10-14 22:52:26 · 550 阅读 · 1 评论 -
侯捷C++手把手教学:数量不定的模板参数、关键词auto、ranged-base for
数量不定的模板参数,variadic templates(since C++11)void print() //传入个数为0,调用这个{}template<typename T,typename... Types>void print(const T& firstArg,const Types&... args) //sizeof...(args)可以算一包是多少{ cout<<firstArg<<endl; print(args.原创 2020-10-13 22:56:06 · 184 阅读 · 0 评论 -
侯捷C++手把手教学:模板特化,模板偏特化
模板特化(全特化),specializationtemplate <class Key>struct hash { };template<>struct hash<char> { size_t operator() (char x) const { return x; }};template<> //Key被锁定了strcut hash<int> { size_t operator() (int x) c原创 2020-10-12 22:55:31 · 220 阅读 · 0 评论 -
侯捷C++手把手教学:成员模板,member template
成员模板,member templatetemplate <class T1,class T2>struct pair { typedef T1 first_type; typedef T2 second_type; T1 first; T2 second; pair() :first(T1()),second(T2()) { } pair(const T1& a,const T2& b) :first(a), second(b) { }原创 2020-10-12 22:16:01 · 169 阅读 · 0 评论 -
侯捷C++手把手教学:类模板,函数模板,namespace
类模板,class templatetemplate<typename T>class complex{public: complex (T r=0,T i=0) : re(r) ,im(i) { } complex& operator +=(const complex&); T real () const { return re; } T imag () const { return im; }p原创 2020-10-11 15:47:59 · 198 阅读 · 0 评论 -
侯捷C++手把手教学:仿函数,function-like classes
标准库中,仿函数所使用的奇特的base classestemplate <class Arg, class Result> //这两个类的特点:大小为0,没有函数struct unary_function { typedef Arg argumrnt_type; typedef Result result_type;};template <class Arg1,class Arg2,class Result>struct binary_function原创 2020-10-11 14:40:17 · 171 阅读 · 0 评论 -
侯捷C++手把手教学:智能指针,迭代器
pointer-like classes,关于智能指针template<class T>class shared_ptr{public: T& operator*() const { return *px; } //重载& T* operator->() const { return px; } //重载* shared_ptr(T* p):px(p) { } //构造函数,将某个类赋予智原创 2020-10-11 11:11:50 · 473 阅读 · 1 评论 -
侯捷C++手把手教学:含有explicit的构造函数、转换函数
non-explicit-one-argument ctorargument指的是实参class Fraction{public: Fraction(int num,int den=1) //此构造函数有两个参数,但只需要一个实参 : m_numerator(num),m_denominator(den) { } Fraction operator+(const Fraction& f) { return Fraction(......);原创 2020-10-11 09:34:48 · 174 阅读 · 0 评论 -
侯捷C++手把手教学:conversion function转换函数
将一个分数(分子,分母)转化为小数class Fraction{public: Fraction(int num,int den=1) : m_numerator(num),m_denominator(den) { } operator double() const { //此为转换函数,没有return type(返回类型) return (double)(m_numerator/m_denominator); //返回类型可以观察函数名 }原创 2020-10-10 22:09:17 · 131 阅读 · 0 评论 -
带虚函数的继承、模板模式、观察者模式
继承关系中:子类可以继承父类的数据和函数。数据继承下来会占用内存的一部分;函数继承下来可以理解为子类继承的是父类函数的调用权,子类可以调用父类的函数。(调用权第一次听说,hh)Inheritance(继承)with virtual functions(虚函数)non-virtual函数:你不希望derived class重新定义(override,覆写)。virtual函数:你希望derived class重新定义(override,覆写)它,且它已有默认定义。pure virtual函数:你希望原创 2020-10-09 22:22:59 · 115 阅读 · 0 评论 -
侯捷C++手把手教学:复合,委托,继承
Composition(复合),表示has-a(可以理解为外驻)Adapter(容器适配器)template <class T>class queue { //先进先出的队列 ...protected: deque<T> c; //底层容器,双端队列public: //以下完全利用c的操作函数完成 bool empty() const { return c.empty(); } size_type size() co原创 2020-10-09 00:23:05 · 236 阅读 · 0 评论 -
侯捷C++手把手教学:static用法,单例模式,函数模板,namespace
static类型的数据及函数static data members:在所有实例中只存在一份,而non-static data members有几个实例,就会产生多少份。举例:银行会拥有很多客户,每个客户都是一个个实例,他们的一般数据都是自己有一份,但是每天的利率都是一样的,可以声明为static。static member functions:只能处理static data members。class Account {public: static double m_rate; //类原创 2020-10-08 15:20:45 · 243 阅读 · 0 评论 -
侯捷C++手把手教学:String类的完整实现(带指针的类)
声明:class String{public: String(const char* cstr = 0); String(const String& str); String& operator=(const String& str); ~String(); char* get_c_str() const { return m_data; }private: char* m_data;ctor和dtor(构造函数和析构函原创 2020-10-08 09:18:32 · 444 阅读 · 0 评论 -
侯捷C++手把手教学:堆、栈与内存管理
所谓stack(栈),所谓heap(堆)Stack:是存在于某作用域(scope)的一个内存空间(memory space)。例如当你调用函数,函数本身即会形成一个stack用来放置它所接收的参数,返回地址,及局部对象(local object)。Heap:或称system heap,是指由操作系统提供的一块global内存空间,程序可动态分配(dynamic allocated)从中获得若干区域(blocks)。stack objects的生命期class Complex { ... };..原创 2020-10-07 21:56:50 · 1200 阅读 · 0 评论 -
侯捷C++手把手教学:输出函数
output函数#include <iostream.h>ostream& operator<<(ostream& os,const String& str){ os << str.get_c_str(); //当os函数输出指向字符串的指针时,它会自动输出整个字符串,然而如果这个指针指向其他类型,则输出的是指针变量的右值。 return os;}...原创 2020-10-07 18:10:12 · 284 阅读 · 0 评论 -
侯捷C++手把手教学:三大函数:拷贝构造,拷贝赋值,析构
三大函数:拷贝构造,拷贝赋值,析构当类中含有指针,则不能用系统默认的那一套拷贝构造,拷贝赋值。class String{public: String(const char* cstr =0); //普通的构造函数 String(const String& str); //拷贝构造函数 String& operator=(const String& str); //拷贝赋值函数 ~String(); //析构函数 char* ge原创 2020-10-07 10:56:58 · 279 阅读 · 0 评论 -
侯捷C++手把手教学:操作符重载与临时对象
操作符也类比为一种特殊函数。所有的成员函数都带有一个隐藏的参数,即this。但调用的参数列表里不能写出来,函数里可以用。返回值最好是引用,防止链式调用,继续传递。法则:传送者无需知道接受者是以reference形式接收。下面的函数决不可return_by_reference,因为它们返回的必定是个local object。inline complexoperator + (const complex& x,const complex& y){ return comple原创 2020-10-07 09:15:46 · 180 阅读 · 0 评论 -
侯捷C++手把手教学:构造函数、参数传递与返回值
1.初始化、赋值使用初始列比使用赋值效率更高。complex(double r=0,double i=0) :re(r),im(i) //初始列,初值列 { }complex(double r=0,double i=0){ re=r;im=i; } //赋值不带指针的类,多半不用写析构函数。一个以上的构造函数,函数名称可能一样,但是只要参数不同,利用重载,编译器会根据参数的类型和参数的个数改变其函数名。重载构造函数,不能产生二义性。2. 参数传递与返回值cons原创 2020-10-06 22:58:38 · 359 阅读 · 0 评论 -
复数complex侯捷大师级写法,声明加定义
复数complex大师级写法,声明加定义首先防卫式的头文件申明#ifndef _COMPLEX_#define _COMPLEX_class complex{public: complex(double r=0,double i=0) //默认值 :re(r),im(i) { } complex& operator +=(const complex&); double real () const {return re;} /原创 2020-10-06 16:08:09 · 239 阅读 · 1 评论