c++语言程序设计郑莉 学习笔记

1.流类对象  11章会讲

 

 

2.带类的c 第2讲 c++11 2011年出现的 c++14在c11基础上修复漏洞

 

3.cout输出流类的一个对象  cout << “helloworld”  给一个流对象重载运算符

 

4.include 预编译处理 包含库

5.using namespace std 命令空间,防止同名函数命名冲突

std::std::cout << “hello”

 

6.vs2013 express免费的  看下编译 和加断点

 

 

7.视频c风格字符串

字符串常量:

1.字符数组  继承自c语言

用字符数组存储字符串

例子:

char str[8] = [‘p’,’r’, ‘o’, ‘g’, ‘r’, ‘a’, ‘m’, ‘\0’]; 忘了添加\0 程序会出错

缺点

1.连接拷贝比较要调库函数

2.当字符串长度不确定时候,要new 动态创建字符数组 还要delete。

3.字符串

但是要求能看懂别人的c风格字符串

char str[8] = “program”;

char str[] = “program”;

 

const char * ptr = “program”;

2.string

建议用这个,拼接和赋值很方便,可以用下标访问,类似字符数组。

第八章string类重载了 运算符

 

string s2;

cin >> s2 ; //输入多少个字符都可以,不会越界   >>提取运算符

 

8.c语言

字符数组和字符串

strlen 字符串有效长度,到\0长度,不包含\0

 

9.sizeof 对象

不要去数成员变量。因为实例化时候,会隐含的生成一些没有定义 的数据成员。

 

 

10.cin 以空格为结束符,

getline 以换行符结束,可以一行输入里,有空格

istream& getline (istream& is, string& str, char delim);

istream& getline (istream& is, string& str);

 

 

11.vector

v.begin()

v.end()   迭代器  返回的是面向对象的指针

 

12.auto 随着初始值来定类型

 

13.for(auto e : v)

 

14.static  整个程序运行时间都存在

如果static变量放在函数体里。第二次进来时候不会再对这个static变量初始化了。采用上次的值

全局的寿命 局部的作用域

 

 

15.this指针

是因为非静态成员函数  隐含的传了一个参数 这个参数是 当前对象的地址

 

 

16.???第六章  类的成员有指针时候,默认的拷贝构造函数 就不满足了。必须用深拷贝了

 

17.在函数体里 返回一个对象。局部对象  不可能传给调用者,会发生拷贝构造,生成一个临时无名对象

 

18.constexpr

 

19.学堂在线

http://www.xuetangx.com/courses/course-v1:tsinghuax+00740043x_2015_t2+sp/courseware/e10b913bad0548cabe292da7b4818523/8189c2680bcc479d8e9db124b7f07e50/

 

20.析构函数  一个对象在函数里定义,在离开这个函数作用域时候,会自动调用这个对象的析构函数

 

 

21.部件类一定要写一个不带参数的默认构造函数。防止 组合类的成员中 含有部件类对象做成员变量。组合类的构造函数中,初始化列表没有初始化部件类对象。

 

22.charpter4   4_4.cpp调了四次拷贝构造函数。先是构造函数形实结合 对象初始化调拷贝构造函数。后是初始化列表,调拷贝构造函数

组合类的构造函数 参数后要加冒号 用初始化列表来初始化 类的数据成员对象。

 

23.

const

常对象

常引用

常函数

常指针

 

24.static变量 静态生存期,在类里声明,不能在类里初始化,必须在类外定义和初始化。因为类里是实例化才会被初始化。

 

25.友元函数 和友元类,是单向的。友元是为了给别人开一个捷径去访问私有成员。是与private访问权限相反的。

 

 

26.vector灵活的改变它的长度,相比数组不会越界。是因为类库里,对vector做了自动对长度进行伸缩。

 

 

27.????共享数据 看一下以前项目的代码 获取某个类的成员的值  getinstance   单例模式

1.模块 函数之间传递数据

常引用

常对象    实现里面常对象,会调常函数。想修改常成员,是非法的

2.类之间共享数据

友元      可以直接访问别的类的成员,并且修改。

3.对象之间

同一个类的所有对象共享数据成员static,定义静态数据成员。用静态成员函数来处理静态数据成员。      //练习里,多个类对象可以共享static静态成员,访问的时候,通过公有方法去访问static成员。

 

4.在构造函数中new新对象,在析构函数中释放

传const引用

函数指针

用类对象去初始化新对象,类定义时候写了拷贝构造函数

动态数组   new className []   delete [] points

 

 

为什么返回引用   当左值

为什么element函数返回对象的引用?

返回“引用”可以用来操作封装数组对象内部的数组元素。如果返回“值”则只是返回了一个“副本”,通过“副本”是无法操作原来数组中的元素的

http://www.xuetangx.com/courses/course-v1:TsinghuaX+00740043X_2015_T2+sp/courseware/d4eb7d174ba04a4da6282bcae197892c/3ddce3f3dcb74818b6460b6d94795bad/

 

类成员函数定义:

ArrayOfPoints(int size) : size(size) {

points = new Point[size];

}

 

Point& element(int index) {

assert(index >= 0 && index < size);

return points[index];

}

 

调用:

points.element(0).move(5, 0); //访问数组元素的成员

 

 

28.要记住这些概念,是因为你没有透彻理解。可以用反证,调试的办法来跑一下程序。能很明显加强理解。

反证法:

标识符之外的作用域访问这个变量

用普通的成员函数去处理常对象

 

29.运算符重载

 

30.????c++11 基于范围的for循环,自动遍历整个容器for循环。 这里for循环的用法讲的很不清晰 for(int & e : array)

用命令还能在nuiservice中搜到更多for循环用法   grep -rin  "for (" * -r

 

30.

不要将非静态局部地址用作函数的返回值

错误的例子:在子函数中定义局部变量后将其地址返回给主函数,就是非法地址

 

31.

*****在子函数中通过动态内存分配new操作取得的内存地址返回给主函数是合法有效的,但是内存分配和释放不在同一级别,要注意不能忘记释放,避免内存泄漏

 

32.

指针类型的函数 * funciton () 返回值是指针 和 函数指针  (*function)()  一个指针指向函数起始地址

 

33.

????回调函数 这里讲的非常好,后面查一下相关网上资料。

声明时候  computer(int , int , int(*funciton)(int,int))

调用时候   computer(a,b,max)或者 computer(a,b,&max)

另一种使用方式:

void (*pf)(int,char*);pf=fun

 

前向引用声明,出错的例子跑一下

 

34.????

常成员函数和  函数指针结合的例子  6_13.cpp。 严格check等式两边的类型    类的成员函数  const

const也是静态成员

 

35.分配和释放动态数组

 

 

  • 分配:new 类型名T [ 数组长度 ]
    • 数组长度可以是任何表达式,在运行时计算
  • 释放:delete[] 数组名p
    • 释放指针p所指向的数组。p必须是用new分配得到的数组首地址。

 

 

36.返回对象的引用  6_18.cpp

Point& element(int index) {

assert(index >= 0 && index < size);

return points[index];

}

 

为什么element函数返回对象的引用?

返回“引用”可以用来操作封装数组对象内部的数组元素。如果返回“值”则只是返回了一个“副本”,通过“副本”是无法操作原来数组中的元素的

智能指针

  • 显式管理内存在使用上有优势,但容易出错。
  • C++11提供智能指针的数据类型,对垃圾回收技术提供了一些支持,实现一定程度的内存管理

 

 

 

37.动态数组封装在类里  6_18.cpp    这样防止遗漏delete,导致内存泄漏。缺点是,只能容纳 类的对象。vector解决了这个问题,可以容纳任何类型的数组。

class ArrayOfPoints {

public:

ArrayOfPoints(int size) : size(size) {

points = new Point[size];

}

 

~ArrayOfPoints() {

cout << "Deleting..." << endl;

delete[] points;     

}

 

 

38.vector    对比原来的项目  vector用法???? 下标访问和size()方法。  String和vector 就很好用了。   第八章重载了vector的[]下标的运算符

  • vector<元素类型> 数组对象名(数组长度);
  • 例:

vector<int> arr(5)建立大小为5的int数组

 

基于范围的for循环 for(auto e :v) v里面是什么类型  e就是什么类型  e的类型写成auto就可以了

for(auto i= v.begin(); i != v.end(); i++)   i是迭代器,这里可以理解成面向对象的指针       ????第十章  泛型模板

 

 

 

公有派生类对象可以被当作基类的对象使用,反之则不可。

  • 派生类的对象可以隐含转换为基类对象;
  • 派生类的对象可以初始化基类的引用;
  • 派生类的指针可以隐含转换为基类的指针。

 

 

40.

单步跟踪第七章的例题

有继承 访问控制权限

派生类对象怎么去构造 怎么去析构  构造函数 析构函数怎么写

基类和派生类存在类型兼容的关系,可以将公有派生类的对象当基类对象使用。

通用的显示函数 目的没达到。

**************************************

00:03:39,360 --> 00:03:41,840

就是在第七章里

大家没能实现成功的那个

通用的显示函数

大家一直觉得非常的奇怪

为什么呢

怎么办呢

为什么通过基类的指针

明明已经指向了派生类的对象

可是在执行的过程中

却不能够自动找到

派生类中对应的函数呢

那么确实这是一个悬念

**************************************

多继承的二义性问题    虚基类解决了这个问题 virtural的用处

 

41.(和40最后多继承二义性结合看)虚基类

  • 需要解决的问题
    • 当派生类从多个基类派生,而这些基类又共同基类,则在访问此共同基类中的成员时,将产生冗余,并有可能因冗余带来不一致性
  • 虚基类声明
    • 以virtual说明基类继承方式
    • 例:class B1:virtual public B
  • 作用
    • 主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题
    • 为最远的派生类提供唯一的基类成员,而不重复产生多次复制

 

 

42.那么多态性是个什么

在计算机编程领域呢?  多态  顾名思义就是操作接口,具有表现多种不同形态的能力,在不同的环境下,对不同的对象,具有不同的处理方式

那多态到底是怎么实现的呢?  实际上是通过绑定来实现的

所谓绑定呢?  就是将一个标志符名称  与一段函数代码结合起来。  比如说  我们的函数调用表达式  跟函数体结合  这就是一种绑定

 

静态联编和动态联编   编译时绑定和运行时绑定

早绑定 和晚绑定  静态绑定(编译时绑定)和 动态绑定(运行时绑定)。

按照它的实现的时机呢

分成编译时的绑定

和运行时的绑定

编译时的绑定呢

也叫早绑定

那么也就是在编译阶段

编译器就把这个绑定完成了

那么运行时的绑定呢

是等到运行的时候

才将这个标志符

和相应的函数代码结合起来

那么叫运行时的绑定

或者叫晚绑定

那在C++中呢

实际上我们学过的函数重载

实际上也是一种多态性

它是静态多态性的一种体现

也就是函数重载

是通过早绑定

或者是编译时的绑定来完成的

 

 

43.左值和右值

第八章 运算符重载 video3

由于这个后置+1

 

它使用的是

这个对象的一个副本

而不是这个对象自己

所谓右值就是通过这个值

你是不能去改变这个对象的

因为它返回的就是一个复制品

你通过这个复制品

你用这个值没有问题

你触及不到这个对象本身

而前置++呢

它返回的就是对象本身

那么返回值

是当前对象的这个引用

所以通过这个引用

你可以直接操纵这个对象的

所以这是前置++和后置++

它的另一个不同点

就是它的运算结果

前置的它是一个左值

后置的自增

它的运算结果是一个右值

实际上

就是它原来对象的一个副本

 

 

44.把第八章的运算符重载代码跑一遍

如果不传引用 会导致什么 前置++

如果不做成 友元函数会有什么问题   运算符<<的重载

 

第八章综合实例 里储蓄账户和信用卡账户 代码写的非常好

 

它用了虚函数 账户衍生出储蓄账户和 信用卡账户

用了运算符重载  data

利息结算方式不同 又分信用卡每月结算 和储蓄账户每年1月1日结算   结算利息方式不一样导致的问题解决了。

 

override重写覆盖

和final 关键字

 

45.

虚表

 

 

46.template <class T>  //定义函数模板

void outputArray(const T *array, int count) {

 

 

47.

重载函数都可以拿函数模板来写   第九章 模板与群体数据小结

 

同类型的数据 和处理方法 可以用类模板来实现,

数据成员的类型  函数成员里的局部变量类型 参数类型  返回值类型 都可以弄成抽象数据类型

 

为处理打批量的群体数据非常有好处。

查找排序

栈 队列 结构的操作,给了函数模板,使得处理数据变的容易,效率更高

 

经典算法的处理都统一了。

第十章STL 把这些都做成了库,方便我们调用。所以这一章也是stl源码的一种实现

 

 

 

**************************************************************

最关心的是 const  对象  const作为参数

内存

sizeof

设计模式

***************************************************************

nuiservice用到的新语法

1.constexpr

2.for(auto e : v)// for (auto currenttaskcontext : usercontext->gettasks())

3.auto  //auto dlresult = result->getdialogresult();

4.vector // std::vector<string> protocols;  //std::vector<unsigned char> opus_datas_;  // std::vector<std::string>* out_phones

// std::vector<phoneid>* out_phones

#include <vector>

template void serializehelper::serialize(const concurrent_vector<vector<double>> &var);

 

5.deserializer() = default;  //程序中定义了构造函数,告诉编译器仍然生成默认构造函数

6.noncopyable(const noncopyable&) = delete;

// “=delete”

l  如果不希望对象被复制构造

n    c++98做法:将复制构造函数声明为private,并且不提供函数的实现。

n  c++11做法:用“=delete”指示编译器不生成默认复制构造函数。

l  例:

class point {   //point 类的定义

public:

    point(int xx=0, int yy=0) { x = xx; y = yy; }    //构造函数,内联

    point(const point& p) =delete;  //指示编译器不生成默认复制构造函数

private:

    int x, y; //私有数据

};

// http://www.xuetangx.com/courses/course-v1:tsinghuax+00740043x_2015_t2+sp/courseware/81f9b7e20c9c4850b29ccb249c5ed366/bddb5c6be3b5437b967fa2fc6566891f/

 

???第八章  赋值构造函数    赋值运算符 重载 。赋值运算符右边是对象

 

 

namespace  // namespace yunos { …}

 

 

sharedptr

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值