十五章 札记--C++ primer 之旅

新版课件清华大学机器学习课件-011第十一讲 隐马尔科夫模型.pdf 新版课件清华大学机器学习课件-011第十一讲 隐马尔科夫模型 立即下载

C++动态绑定的实现     
在C++中,通过基类的引用(或指针)调用虚函数时,发生动态绑定。引用(或指针)既可以指向基类对象也可以指向派生类对象,这是动态绑定的关键。 用引用(或指针)调用的虚函数在运行时确定,被调用的函数是引用(或指针)所指向对象的实际类型所定义的。




虚函数: 除了构造函数外,任意非static 成员函数都可以是虚函数。保留字virtual 只在类内部的成员函数声明中出现,不能用在类定义体外部出现的的函数体上。      基类通常应将派生类需要重定义的任意函数定义为虚函数。

访问控制和继承:
public:        无限制
private:      只能是基类的成员和友元可以访问。
protected: 可以被派生类对象访问但不能被该类型的普通用户访问。



protected 成员重要性质:
     派生类只能通过派生类对象访问其基类的protected 成员,派生类对基类类型对象的protected成员没有特殊访问权限。

举个栗子:假设 class A_base ;   class A ;   A_base 是基类, A是 派生类,  A 中定义一个成员函数,接受一个A对象的引用 和 一个A_base 对象的引用,该函数可以访问自己的protected 成员以及A 形参的protected成员,但是,不能访问A_base 形参的protected 成员。



派生类
     派生类列表: 为了定义派生类,使用派生类列表指定基类。 派生类列表指定了一个或多个基类。
格式如下: class classname : access-label base class
access-label: 是public、protected或private 

每个派生类对象包含两部分: 从基类继承的成员 和 自己定义的成员。

派生类与虚函数: 如果派生类没有重定义某个虚函数,则使用基类中定义的版本。

派生类中 虚函数的声明必须与基类中的定义方式完全匹配,返回类型可以不同: 返回对基类型的引用(或指针) 的虚函数,派生类中的虚函数可以返回基类函数所返回类型的派生类的引用(或指针) [后面的clone函数就会说明为什么返回类型如果是指针的话 可以为基类或派生类]

一旦函数在基类中声明为虚函数,就一直是虚函数,派生类无法改变该函数为虚函数的命运。派生类重定义虚函数时, virtual 保留字可用可不用。

派生类对象 包含基类对象 作为子对象。
     派生类对象由多个部分组成: 派生类本身定义的(非static)成员加上由基类(非static)成员组成的子对象。
     
派生类对象 的组成结构:      
基类成员
派生类成员

     每个派生类对象都有基类部分,类可以访问其基类的public 和 protected 成员 ,就想访问自己的成员一样

用作基类的类必须是已定义的 (实际中就是派生类的定义文件(头文件) 必须include 基类的定义文件(头文件))

最底层的派生类 对象包含其每个直接基类或间接基类的子对象

派生类的声明:
     如果需要声明(并不实现) 一个派生类,则声明包含类名但不包含派生列表。
      EX : 如果声明class A :
                class  A;     
                class  A_base;



virtual:
     触发动态绑定的两个条件:
          1) 只有指定为虚函数的成员函数才能进行动态绑定,成员函数默认为非虚函数。
          2)必须通过基类类型的引用或指针进行函数调用。

1 从派生类到基类的转换:因为每个派生类对象都包含基类部分,所以可将基类类型的引用绑定到 派生类的基类部分,也可以用指向基类的指针指向派生类对象。
     无论实际对象具有哪种类型,编译器都将它当做基类类型对象. 注: 任何可以在基类对象上执行的操作也可以通过派生类对象使用


     静态类型和动态类型  
静态类型编译时可知的引用类型或指针类型
动态类型指针或引用所绑定的对象的类型,这是仅在运行时可知的。

   概念:
     引用和指针的静态类型与动态类型可以不同!
     对象是非多态的,对象类型已知且不变。对象的动态类型总是与静态类型相同。
     只有通过引用或指针调用,虚函数才在运行时确定。

编译时确定非 virtual 调用: 非虚函数总是在编译时根据调用该函数的对象、引用或指针的类型而确定。
     EX  :  class A_base ; class A;   
A_base 中定义了非虚函数 void fun() , 
A 中也定义了 void fun();  
                A_base & ab = *(new A());   
即定义A_base 的引用,引用的对象是A ,但是如果执行 ab.fun() ,也是调用基类的func ,指针也相同。


覆盖虚函数机制:         
     情况: 希望覆盖虚函数机制 并 强制函数调用使用虚函数 的特定版本,可以使用作用域操作符:
               EX: 假设 A_base 定义了虚函数  :virtual  int getValue(){};
                              A       重定义了 getvalue() :   int getValue(){};
                       A   aClass;
                       A_base *baseP = &aClass;
                       int ans=baseP->A_base::getValue();

      注意: 只有成员函数中的代码才应该使用作用域操作符覆盖虚函数机制
      注意: 派生类虚函数调用基类版本时,必须显式使用作用域操作符。如果派生类函数忽略作用域操作符,函数调用会在运行时确定并且将是一个自身调用,导致无穷循环

虚函数与默认实参:  虚函数中的默认实参值 是在编译时确定的。所以在同一虚函数的基类版本和派生类版本中使用不同的默认实参会引起麻烦。(就会用基类的默认参数值~~~ 与期望的值不同)


访问控制, 公用,私有 和 受保护
     
     每个类控制他所定义的成员的访问。派生类可以进一步限制但不能放松对所继承的成员的访问。


无论 派生列表中是什么 访问标号, 所有继承基类的 类 对基类的成员具有相同的访问。 派生访问标号将控制派生类的用户对从 基类继承而来的成员的访问。
派生访问标号 还控制 来自 非直接派生类 的访问。 
其实就是派生访问标号 在什么时候 有作用:
     1) class A : public  A_base {}  
    class AA : private A_base{};  
           则 在类 A 和 类AA 对 A_base 的成员具有相同的访问; 而 A 和 AA 的具体对象对A_base 的访问 权限则不同。
     2) class AAA : public AA;   AAA 则不能 对A_base 的成员进行访问, 因为AA 从A_base 继承 的成员 为private,跟派生访问标号相同。

接口继承与实现继承:
     public 派生类 继承基类的接口,具有与基类相同的接口。
     使用private 或 protected 派生的类不继承基类的接口, 称为实现继承。


恢复继承成员的访问级别:
     派生类可以恢复继承成员的访问级别, 但不能使访问级别比基类中原来指定的更严格或跟宽松。
     using  基类类名::基类成员


默认继承保护级别:使用class 保留字 定义的派生类 默认具有 private 继承
                                    struct     ...........................................   public 




友元关系与继承:
     友元关系不能继承。基类的友元对派生类的成员没有特殊访问权限。如果基类被授予友元关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予友元关系的类。




继承与静态成员
     如果基类定义了static 成员, 则整个继承层次中只有一个这样的成员。无论从基类派生出多少个派生类,每个static成员只有一个实例。


转换和继承

1 引用转换 != 转换对象:  将对象传给希望接受引用的函数时,引用直接绑定到该对象, 实际上实参是该对象的引用,对象本身未被复制, 并且,转换不会在任何方面改变派生类型对象,如果传递的实参是存储派生类的基类引用! 该对象仍是派生类型对象。

    将派生类对象传给希望接受基类类型对象(不是引用)的函数是, 情况完全不同。这种情况下,形参的类型是固定的——在编译时和运行时形参都是基类类型对象。  如果实参是形参的派生类,则该派生类对象的基类部分被复制到形参。

(注意以上两种转换的差别!!!!)

2  用派生类对象对基类对象进行初始化 或 赋值

     初始化: 调用函数 —— 复制构造函数
     赋值:    调用函数 —— 赋值操作符

     1、可以自己定义基类的复制构造函数(以派生类引用作为形参) 和 赋值操作符(右操作数为派生类const引用)
     2、基类定义自己的复制构造函数 和  赋值操作符。 这些成员接受一个形参,该形参是一个基类的const 引用。(因为存在派生类引用到基类引用的转换)一般是定义这个的复制构造函数

再次谨记: 派生类的引用是可以由编译器自动转换成基类引用的。

3 派生类到基类转换的可访问性

     判定规则:如果派生类对基类的public 成员可以访问,则转换可访问的;否则,转换不可访问。

     public 继承, 则用户代码和后代类都可以使用派生类到基类的转换。
     private 或 protected :用户代码不能将派生类型对象转换成基类对象。
     private继承: 从private继承类派生的类 不能转换成基类。 而protected 则可以。


基类到派生类的转换:
     从基类到派生类的自动转换是不存在的。
     如果知道从基类到派生类的转换是安全的。可以使用 static_cast 强制转换 或 dynamic_cast 申请运行时检查。



构造函数 和 复制控制:

     构造函数 和 复制控制成员不能继承

     派生类构造函数:
              每个派生类的构造函数除了初始化自己的数据成员,在这之前,还应调用基类的构造函数初始化基类成员
                  
           向基类构造函数传递实参:派生类构造函数的 初始化列表只能初始化派生类的成员,不能直接初始化继承成员。但是,派生类构造函数通过将基类包含在构造函数初始化列表 中来间接初始化继承成员。
     
           只能初始化直接基类

     
     复制控制和继承
          
          定义派生类复制构造函数: 如果派生类显示定义自己的复制构造函数或赋值操作符,则该定义完全覆盖默认定义,被继承类的复制构造函数和赋值操作符 负责对基类成分 以及 类自己的成员进行复制或赋值。

          注意: 如果派生类定义了自己的复制构造函数,该复制构造函数一般应显式使用基类复制构造函数初始化对象的基类成分。
                        形式    Derived(const Derived& d) : base(d) {};  里面自动把派生类的引用转换成基类引用
           原因:  如果没有,则对象的基类成员 调用基类的默认构造函数初始化 :  基类成分 保存默认值, 而 派生类部分是另一对象的副本。

     
         定义派生类赋值操作符: 如果派生类定义了自己的赋值操作符,则该操作符必须对基类部分进行显示复制:
                                                        形式:  Derived & Derived::operator=(const Derived &rhs){
                                                                           if(this != &rhs) { 
                                                                                Base::operator=(rhs); .....} 
                                                                           return *this;}
     
            
           派生类析构函数:派生类析构函数 不负责撤消基类对象的成员          
                                            对象的撤消顺序与构造函数相反: 首先运行派生类析构函数,然后按继承层次依次向上调用各基类析构函数。


           虚析构函数:动态释放对象有关。。。个人认为只要跟动态扯上关系,就离不开virtual 了~~~ 
    原因:指针的动态类型与静态类型不同。 比如实际指向派生类对象的基类类型指针。
                                    如果析构函数为虚函数,通过指针调用时,运行哪个析构函数将 因指针所指向对象类型的不同而不同。
                                     注意: 即使析构函数没有工作,继承层次的根类也应该定义一个虚析构函数

                      注意: 构造函数 和  赋值操作符不是虚函数


            构造函数和析构函数中的虚函数
                      两种情况下:运行构造函数 或 析构函数时候, 对象都是不完整的。     
                      在基类构造函数或析构函数中,将派生类对象当作基类类型对象对待。
                       规则: 如果在构造函数 或 析构函数中调用虚函数, 则运行的是为构造函数 或 析构函数 自身类型定义的版本。



     对象、引用或指针 的静态类型决定了对象能够完成的行为。
     
 作用域与成员函数:
同名 不同类型 的函数 屏蔽!!!!
     在基类和派生类中使用同一名字的成员函数, 其行为与数据成员一样: 派生类作用域中派生类成员将屏蔽基类成员。即使函数原型不同, 基类成员也会被屏蔽。

       注意: 局部作用域中声明的函数不会重载全局作用域中定义的函数, 同样,派生类中定义的函数也不重载基类中定义的成员。 通过派生类对象调用函数时,实参必须与派生类中定义的版本相匹配,只有在派生类中根本没有定义该函数时,才考虑基类函数。

     重载函数:成员函数也可以重载。派生类可以重定义所继承的0个或多个版本。
                      如果派生类重定义了重载成员, 则通过派生类型只能访问派生类中重定义的那些成员。
                      如果派生类想通过自身类型使用所有的重载版本,则派生类必须要么重定义所有重载版本,要么一个也不重定义。

  通过using 声明可以简化 重载 所有版本的函数!!! 只是简化而已,原理还是一样的。
          using 声明: 派生类不用重定义所继承的每一个基类版本,用using 声明将该函数的所有重载实例加到派生类的作用域。 之后,派生类只需要重定义 本类型确实必须 定义的那些函数。对其他可以使用继承的定义。
          注意: 一个 using 声明 只能指定一个名字, 不能指定形参表。



     虚函数与作用域
          获得动态绑定:必须通过基类的引用或指针调用虚函数。
     
            通过基类调用被屏蔽的虚函数                
          class Base
{
     public:
          virtual int fcn();
};
    
class D1:public Base
{
     public:
          int fcn(int);// 隐藏了base 的虚函数 fcn 名字相同,原型不同,屏蔽了~~~
};

class D2:public D1
{
     public:
          int fcn(int); //重定义了 D1 中的 fcn(int);           原型相同,重定义了。
          int fcn();      // 重定义了 base 的 fcn();
};


     名字查找与继承:
            确定函数调用的四个步骤:
               1)首先确定进行函数调用的对象、引用或指针的静态类型。
               2)在该类中查找函数,如果找不到,就在直接基类上查找,如此循着继承链往上找。如果都找不到,则调用错误。
               3)一旦找到名字, 进行常规类型检查,查看找到的定义,该函数调用是否合法。
               4)假定函数调用合法, 编译器就生成代码。如果函数是虚函数且通过引用或指针调用,则编译器生成代码以确定根据对象的动态类型运行哪个函数版本,否则,编译器生成代码直接调用函数

如上 3)步骤可以解释为什么 名字相同,原型不同的函数 在派生类里面为什么屏蔽了基类的函数, 因为找到名字之后就不眼继承链再找了,直接进行匹配了,所以不存在重载的可能性了。
        4) 步骤可以解释为什么虚函数 规定在 基类和派生类里面要完全匹配了, 一般是通过 基类的引用或指针 去调用虚函数的,如果某个派生类的虚函数 与 基类不完全匹配(返回类型可以不一样) ,则在调用虚函数的时候,基类找到这个虚函数的名字,但是函数的匹配和调用不同,已经报错了, 还谈什么动态绑定。


          运行实例:
                             class Base
{
public:
     virtual void fun(int i=8)  
     {
          cout<<"Base:"<<i<<endl;
          //return this;
     }
};

class Derived: public Base
{
public :
     void fun(int i)
     {
          cout<<"Derived:"<<i<<endl;
          //return this;
     }
};

int main()
{

     Base * bp1, *bp2;
     bp1 = new Base();
     bp2 = new Derived();

     bp1->fun(1);
     bp2->fun();
}

结果:
Base:1
Derived:8 // 这里的默认值确定 ,应为虚函数的默认实参是在编译时确定的,因为是通过基类指针调用的,所以默认参数值是基类里面的默认值
请按任意键继续. . .




纯虚函数 在函数形参表后面写上=0
                   含有(或继承) 一个或多个纯虚函数的类是抽象类。除了作为抽象基类的派生类的对象的组成部分,不能创建抽象类型的对象。




容器与继承
                    因为派生类对象在赋值给基类对象时会被“切掉”, 所以容器与通过继承相关的类型不能很好地融合。





容器补充:带比较器的容器
     首先容器应该知道比较器的类型,所以首先定义比较器的类型

            EX: typedef bool (*Comp) (const Sales_item&, const Sales_item&) ; Comp定义为 函数类型指针类型的同义词。
                   std::multiset< Sales_item, Comp> items (compare) ; compare是一个函数名 (注意: 函数名其实就是函数的地址,可以赋给函数指针)  
             
                   以上的定义: items 是一个 multiset ,保存 Sales_item 对象并使用Comp类型的对象比较它们。
                                              
               


文本查询实验总结:
1、 在class A 中把 class B 声明为友员,只需在 class A 中的头文件声明 class B 中即可,不用包含 class B 的定义。

2、 在class A 中如果有定义到class B ,或对class B 的指针或引用进行操作,则不能仅仅声明class B ,还必须把 class B 的定义包括进来,具体就是include class B 的定义文件(我的操作)

3、 在 class A 中把某个函数func() 声明为友员时,只需声明函数func()即可。

4、 如果没把inline 函数定义在头文件,不小心如果写到实现文件(我不小心写到cpp) 文件里,编译的时候出现了" 无法解析外部符号"的错误。

5、类之间的继承层次要清楚, 因为每个类一般都有自己的定义和实现文件(个人做法) ; 所以继承之间、友员、函数参数 这些东西发生关系,头文件之间的包含关系就来了。。。注意注意: 绝对不能出现两个头文件互相include ,不然会出现很多错误,而且都是莫名其妙的错误,所以当出现很多错误而且觉得莫名其妙是,就检查一下头文件之间的include 是否出现 连环(不仅仅是两个头文件之间) 。 个人觉得一般从基类到派生类的继承层次 了解清楚,所以code 之前还是想清楚。然后再决定一些类似 非成员inline函数 应该放在哪个哪个文件里面。



科技中介服务机构如何提升服务的专业性与用户体验?.docx 科技中介服务机构如何提升服务的专业性与用户体验? 立即下载

相关推荐

政府科技管理者如何高效整合区域创新资源以推动成果转化?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

aba 回文练习 -- 参考罗大神的

#include #include #include #include using namespace std; #define maxn 1024 #define parr(arr,n) printf(#arr":");for(int kk=0;kk int bufa[maxn],bufb[maxn],bufs[maxn],bufv[maxn]; int sa[m

lsff Code World 6748

LLC谐振变换器开环+闭环软启动仿真设计(Simulink仿真实现)

内容概要:本文围绕LLC谐振变换器的开环与闭环软启动过程,基于Simulink平台开展系统性的仿真设计研究,重点涵盖变频控制策略、软开关技术实现、启动过程中的动态响应分析以及闭环系统的稳定性评估。文档不仅提供了LLC谐振变换器的完整仿真模型,还包括详细的计算书、设计报告和参考文献,内容延伸至全桥/半桥LLC、CLLC、PFC、DAB等多种典型电力电子拓扑结构,突出软启动阶段由开环到闭环的平滑切换控制机制,旨在帮助用户深入掌握谐振变换器的建模方法、控制逻辑设计与系统性能优化的关键技术。; 适合人群:具备电力电子技术与自动控制理论基础,从事开关电源、新能源变换系统、车载充电机、直流微网等相关领域的研究生、科研人员及电气工程类工程技术人员。; 使用场景及目标:① 深入理解LLC谐振变换器在软启动过程中实现零电压开通(ZVS)与零电流关断(ZCS)的软开关原理;② 掌握基于频率调制(PFM)的开环启动与闭环稳压控制的切换逻辑与实现方法;③ 学习利用Simulink搭建闭环控制系统模型,完成动态响应测试与控制参数整定;④ 为电力电子装置的工程开发、学术论文撰写、毕业课题研究或产品原型验证提供可复用的技术方案与仿真支持。; 阅读建议:建议结合所提供的仿真模型、设计文档与计算书同步学习,按照“建模—参数设计—开环仿真—闭环接入—动态调试”的流程逐步实践,重点关注控制器设计、反馈环路构建与系统稳定性的仿真验证,并可参照文中列出的其他拓扑案例拓展系统设计思路。

kmp 练习下

/* * ===================================================================================== * * Filename: kmp.cpp * * Description: * * Version: 1.0 * Created: 10/14/

lsff Code World 2290

Pytest 常见问题及其解决方案

Pytest 是一个强大且灵活的测试框架,但初学者在使用过程中难免会遇到各种问题。希望通过这篇文章,你能更好地应对常见的挑战,写出更高效、更稳定的测试代码。测试不是负担,而是保障。写好测试不仅能提高代码质量,还能让你在面对变更时更加从容自信。

qq_52137592的博客 900

华为昇腾Ascend C中级认证考试-tanh

注册昇腾社区账号后可以免费领券考试。

2600_96284887的博客 474

初次邂逅句柄类 --C++ primer

句柄类存储和管理基类指针。 指针所指对象的类型可以变化,既能指向基类类型对象又可以指向派生类类型对象。 用户通过句柄类访问继承层次的操作 (virtual 函数) 设计考虑因素:        1)对任何保存指针的类一样,必须确定对复制控制的具体操作。包装了继承层次的句柄应该表现得像一个智能指针或者像一个值        2)句柄类决定句柄接口屏蔽还是不屏蔽继承层次。 如

lsff Code World 1859

GD32F303实战:用定时器4触发ADC2+DMA,实现10ms精准采样1024点的完整流程

本文详细介绍了在GD32F303微控制器上使用Timer4触发ADC2配合DMA传输,实现10ms精准采样1024点的完整方案。从硬件架构设计、时钟树配置到定时器参数计算,提供了完整的工程实现流程和常见问题排查方法,适用于工业传感器监测等高实时性场景。

weixin_29194693的博客 433

m_sort 归并排序(迭代)

#include #include #include using namespace std; typedef int element; void merge(element *list,element *sorted,int i,int m,int n) { int j=m+1,k=i; while(i if(list[i]  sorted[k++]=l

lsff Code World 1738

ESP-IDF 利用ESP32构建智能音乐播放器(一)---------- 实现SD卡MP3文件的解码与播放

本文详细介绍了如何利用ESP32和ESP-IDF开发框架,从零开始构建一个智能音乐播放器。文章重点讲解了如何通过SD卡模块读取MP3文件,并集成Helix MP3解码库进行软件解码,最终通过I2S接口驱动音频模块实现播放。内容涵盖硬件连接、软件环境搭建、核心解码与输出逻辑,为嵌入式音频开发提供了完整的实战指南。

weixin_29163797的博客 234

Office LTSC 2021/2024专业部署:ODT+config.xml标准化实战

Office部署本质上是企业终端软件生命周期管理的关键环节,其核心原理在于通过声明式配置驱动安装、激活与组件裁剪。Office Deployment Tool(ODT)作为微软官方命令行引擎,配合config.xml这一DSL契约文件,实现可版本控制、可审计、可回滚的自动化交付。该方案技术价值突出体现在稳定性保障(如LTSC长期支持通道)、合规性强化(不绕过授权机制)及运维提效(批量部署、离线支持)。典型应用场景覆盖教育机房批量装机、政企终端标准化、医疗HIS工作站部署等对功能冻结与系统确定性要求严苛的环境

diaocuiguo2493的博客 561

十一章 札记--C++ primer 之旅

find 运算: 形参:两个迭代器,检查两个迭代器实参标记范围内的每一个元素。找到与给定值的元素,返回指向该元素的迭代器;如果没匹配元素,这返回第二个形参。 注意: 泛型算法从不执行容器操作,单独依赖迭代器和迭代器操作实现,算法基于迭代器及其操作实现,而并非基于容器操作。 泛型算法     头文件   泛化的算术算法 头文件 只读算法:

lsff Code World 1308

BIM Revit教程(六)尝试安装 Revit 时显示“Autodesk Revit 已安装。”

在安装Revit或RevitLT时,若系统提示“AutodeskRevit版本已安装”,通常是由于旧版本残留文件未完全清除所致。解决方案包括:1.通过控制面板或Windows设置卸载旧版本Revit,确保所有相关组件被移除;2.使用Autodesk卸载工具(AdskUninstallHelper)进一步清理;3.谨慎操作注册表,删除与Revit相关的残留项;4.确保系统有至少30GB的可用磁盘空间;5.完成上述步骤后,重新尝试安装Revit。此外,文章还提到了一个免费功能商店,供用户寻找提效工具,并鼓励粉丝

ZOZO_888的博客 2130

k_over 重叠字符串

#include #include #include #include using namespace std; #define maxn 1024 #define maxm 1024 int bufa[maxn],bufb[maxn],bufs[maxm],bufv[maxn]; int sa[maxn],height[maxn],rank[maxn];

lsff Code World 1207

基于四旋翼模型的火箭型无人机视线角保持控制仿真设计

本文针对火箭型无人机的视线角保持控制问题展开研究。基于四旋翼动力学模型,通过改造设计了一种摄像头朝上安装的特殊无人机系统,用于追踪空中目标。文章详细推导了坐标系定义、运动学和动力学方程,重点分析了摄像头安装与视线几何关系,建立了目标运动模型和视线向量计算方法。通过解算期望姿态角,实现了使机体Z轴始终对准目标的控制目标。仿真结果表明,该系统能有效完成视线角保持任务,为空对空监视等应用场景提供了可行方案。~~~~~

huanghm88的专栏 143

课堂练习及课后作业2.1:外部中断

本关任务:通过相关知识以及实验回答:版本 1 内核的第 6 次时钟中断发生时,断点和恢复点(指令地址)分别是多少?本关任务:修改版本 0 内核,使得每发生 100 次时钟中断,就在屏幕上输出一个字符‘t’和当时的进程号,如“t(0)”表示0号进程运行时发生了时钟中断。本关任务:通过实际操作回答在输出第一行 0/1 字符的过程中(如下图所示),共发生了几次时钟中断?本关任务:修改版本 1 内核源码,使得每次时钟中断发生时,都在屏幕上输出字符‘t’。分析版本1内核,找到第一次时钟中断的恢复点地址。

Junds0的博客 1万+

二章 札记 --C++ primer 之旅

实习告一段落,翻开C++primer 准备苦逼的重温C++ 。以下是一些 从书上抄下来的笔记。 测试: -10u 是什么类型? -10u 类型是unsigned int  使用 typeid(-10u).name() 测试的 变量的初始化: 1、复制初始化: int ival=1024; 2、直接初始化: int ival(1024); 直接初始化语法更灵活且效率更高。

lsff Code World 817

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

七章 札记--C++ primer 之旅

const 形参:      如果将函数形参定义为非引用的const类型,EX: void fcn(const int i) {};  则不能修改实参的局部副本。   注意:  void fcn(const int i) {}; 和  void fcn(int i) {}; 编译的结果是一样的。 规则: 如果使用引用实参的唯一目的是避免复制实参,则应该将实参定义为const 引用

lsff Code World 752

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C++ new 和 delete 的重载

发现:类里面有几种成员函数是没有this指针的,也就是访问不了类的成员  构造函数:有; 说明其实对象真正的初始化就是在初始化类表  析构函数:有; 析构函数在最后的时刻才把对象空间释放  普通函数:有  static函数: 没有,但能访问静态成员  重载的 new new[]成员函数: 没有, 因为对象的产生是先有空间在调用构造函数,new就是完成前个步骤的工作  重载的 delet

lsff Code World 704

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

十六章 札记--C++ primer 之旅

模板定义: 1、函数模板:             模板定义以关键字 template 开始,后接尖括号括起的模板形参表。                 inline 函数模板, inline 说明符放在模板形参表后面,返回类型之前。     2、定义类模板:            必须以关键字template开头, 后接模板形参类型表。

lsff Code World 645

十四章 札记--C++ primer 之旅

重载运算符:具有特殊名称的函数,operator + 操作符符号 ,具有返回类型和形参表。注意: 重载操作符必须具有至少一个类类型或枚举类型的操作数。大多数重载操作符可以定义为普通非成员函数或类的成员函数。作为类成员的重载函数,形参比操作数数目少1,隐含的this 形参,限定为第一个操作数。规则:一般将算术和关系操作符定义为非成员函数,而将赋值操作符定义为成员操作符重载和友元关系:     操作符

lsff Code World 615

十三章 札记--C++ primer 之旅

复制构造函数:       定义: 一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用。      调用: 当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式使用复制构造函数。 当将该类型的对象传递给函数或从函数返回该类型的对象是,将隐式使用复制构造函数。 析构函数:      定义: 析构函数可用于释放对象在构造或在对象的生命期中所获得

lsff Code World 606

八章 札记--C++ primer 之旅

IO 对象 不可复制或赋值 形参或返回类型不能是流类型,可以通过传递或返回指向该对象的指针或引用 来传递和返回IO 对象。 所有流对象都包含一个条件状态成员,类型为iostate 类型 流的状态由 bad , fail ,eof 和 good 操作解释,如果 bad,fail 或者 eof 任意一个为 true ,则检查流本身将显示该流处于错误状态。反之,如果三个

lsff Code World 564

十二章 札记--C++ primer 之旅

类成员: 可以使数据、 函数 或者 类型别名 typedef 定义的 所有成员必须在类的内部声明。 构造函数: 一般使用一个构造函数初始化列表 来初始化对象的数据成员。                 EX: Sales_item() : units_sold(0),  revenue(0.0) {}                 构造函数初始化式只在构造

lsff Code World 546
上一篇: 十四章 札记--C++ primer 之旅
下一篇: 初次邂逅句柄类 --C++ primer
lsff01
博客等级 码龄14年 4粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值