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.分配和释放动态数组
36.返回对象的引用 6_18.cpp
Point& element(int index) {
assert(index >= 0 && index < size);
return points[index];
}
为什么element函数返回对象的引用?
返回“引用”可以用来操作封装数组对象内部的数组元素。如果返回“值”则只是返回了一个“副本”,通过“副本”是无法操作原来数组中的元素的
智能指针
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
基于范围的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最后多继承二义性结合看)虚基类
42.那么多态性是个什么
在计算机编程领域呢? 多态 顾名思义就是操作接口,具有表现多种不同形态的能力,在不同的环境下,对不同的对象,具有不同的处理方式
那多态到底是怎么实现的呢? 实际上是通过绑定来实现的
所谓绑定呢? 就是将一个标志符名称 与一段函数代码结合起来。 比如说 我们的函数调用表达式 跟函数体结合 这就是一种绑定
静态联编和动态联编 编译时绑定和运行时绑定
早绑定 和晚绑定 静态绑定(编译时绑定)和 动态绑定(运行时绑定)。
按照它的实现的时机呢
分成编译时的绑定
和运行时的绑定
编译时的绑定呢
也叫早绑定
那么也就是在编译阶段
编译器就把这个绑定完成了
那么运行时的绑定呢
是等到运行的时候
才将这个标志符
和相应的函数代码结合起来
那么叫运行时的绑定
或者叫晚绑定
那在C++中呢
实际上我们学过的函数重载
实际上也是一种多态性
它是静态多态性的一种体现
也就是函数重载
是通过早绑定
或者是编译时的绑定来完成的
43.左值和右值
第八章 运算符重载 video3
由于这个后置+1
它使用的是
这个对象的一个副本
而不是这个对象自己
所谓右值就是通过这个值
你是不能去改变这个对象的
因为它返回的就是一个复制品
你通过这个复制品
你用这个值没有问题
你触及不到这个对象本身
而前置++呢
它返回的就是对象本身
那么返回值
是当前对象的这个引用
所以通过这个引用
你可以直接操纵这个对象的
所以这是前置++和后置++
它的另一个不同点
就是它的运算结果
前置的它是一个左值
后置的自增
它的运算结果是一个右值
实际上
就是它原来对象的一个副本
44.把第八章的运算符重载代码跑一遍
如果不传引用 会导致什么 前置++
如果不做成 友元函数会有什么问题 运算符<<的重载
第八章综合实例 里储蓄账户和信用卡账户 代码写的非常好
它用了虚函数 账户衍生出储蓄账户和 信用卡账户
用了运算符重载 data
利息结算方式不同 又分信用卡每月结算 和储蓄账户每年1月1日结算 结算利息方式不一样导致的问题解决了。
override重写覆盖
和final 关键字
45.
虚表
46.template
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
// std::vector
#include
template void serializehelper::serialize(const concurrent_vector
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