C++学习笔记Day 5

来源:互联网 发布:中国高铁 知乎 编辑:程序博客网 时间:2024/05/29 17:19

C++岗位基本要求

在这里,可以学习到全新的IT软件设计开发模式,成为一个软件大牛,你需要以C/C++语言作为主要武器,参与ICT产品的设计开发,包括: (1)根据客户需求进行软件的概要设计和详细设计,学习和使用设计模式; (2)参与代码开发、单元测试、系统测试,掌握代码编写技术和测试技术; (3)完成从需求到设计、再到开发和上线等项目周期中端到端的各个环节。
要求

1、计算机、软件相关专业本科及以上学历; 2、熟悉C/C++语言,有独立进行程序设计开发和验证的能力; 3、熟悉数据结构和算法; 4、熟悉Unix/Linux/Win32环境下编程和调试,熟悉网络编程和多线程编程 ; 5、优选条件 (1)熟悉TCP/IP协议,及互联网常见应用和协议的原理; (2)有IT应用软件、互联网软件等相关产品开发经验; (3)了解网络安全/系统安全基础知识, 有相关工具系统开发和实施经验。

C++知识学习

c++ 支持的编程范式

过程式:顺序 选择 循环
数据抽象 ADT(抽象数据类型) 对数据的逻辑结构进行抽象 只是把操作暴露出来
基于对象 也是封装
面向对象式 继承和多态 程序=对象+对象+对象+消息传递
函数式 更多用递归调用不用循环 LTSP
泛型形式:对象+对象+抽象行为
抽象行为能够施加在不同类型而 又大相径庭的对象之上 通过编程的思想
模板元形式:模板元编程是指给出代码的产生规则,让编译器产生新代码实现我们预期的功能 这样的话 某些运行时的工作被提前到了编译期来完成 但增加了编译时间

C++能支持多种编程范式
值语义和对象语义:值语义可以拷贝和赋值;对象语义不可进行拷贝和赋值

function/bind的救赎 解决面向对象的一些问题 更少的使用继承和多态

C++ 11 值得学习的新特性 智能指针
lambda expression…

优秀书籍 c++primer第四版 (初学者)
专业使用 Effective C++
C++编码规范
敏捷软件开发
代码大全,第二版

开发工具 vs2008 作为开发工具 再安装一个visual assist x

secureCRT

bool类型 存储字节在c++中是一个字节

win32 空项目 新建一个c++文件
声明方式 bool result
const 类型
声明方式 coust int a=100(常量必须初始化)
重新赋值 a=200?? 错误常量不能重新被赋值

const来修饰指针
int b;
const int *p;
p=&b;
*p=200错误 常量不能被赋值
const 在*左边 表示*p为常量 经由*p不能更改指针所指向的内容
常量不能重新被赋值

int * const p2=&b;p2指向b
表示p2是一个常量 而且必须初始化
const出现在*右边 表示p2是常量 同样不能重新指向别的变量 不能重新去赋值
也就是说p2=&b是错误的
但是*p2是可以赋值的 *p2=200 b也就被改成了200

#define 与const区别
const定义的变量有类型 定义的常量在编译时有分配内存 作用域不同
建议定义常量 用 const enum inline 替换 #define
在底层编程 #define还是有用的 但是在高层次尽量用const enum

#define STR(a) #a
#define STR(a,b) a##b

STR(ABCD) 也就是 #ABCD <==>ABCD
泛型编程 替换 也就是灵活

结构体内存对齐

什么是

为什么要对齐

如何对齐 对齐的规则
struct Test
{
char a;
double b;
};//第一个成员与结构体变量的偏移量为0
//其他成员要对齐到某个数的整数倍
结构体总大小为最大对齐数的整数倍

若对齐数为8
则a 0
b 8-15
c 16
再扩充到对齐数的整数倍 也就是从17开始扩充到24
这个数 取编译器预设的对齐整数与该成员大小的较小值 在vs2008中默认值是8
sizeof(Test)==>输出为16个字节 而不是9个字节

#include<iostream.h>using namespace std#include<stdio.h>

域运算符
作用
可以表示全局变量

#include<iostream>using namespace std;int var=100;int main(void){  int var=50  cout<<var;return 0;  }

new delete运算符
new可以创建堆空间
指针变量=new
int* p=new int 分配一个整数空间 4字节
int* p=new int(33) 分配一个整数空间 4字节初始化33

int* p=new int[10] 分配连续的10个整数空间 40字节

delete p;
delete[] p2;(相应的[]不能丢,否则释放的不确定)

new 一个新对象
内存分配(operate new)
new operate 分配内存 调用构造函数
operate new 只分配内存
placement new 不分配内存 调用拷贝构造函数

调用构造函数 而malloc只进行了内存分配

delete 释放一个对象
调用析构函数
释放内存(operate new)

重载
相同的作用域 如果两个参数不同

**静态的多态性
编译的时候确定函数的入口地址**

动态的多态是在运行的时候确定函数的入口地址(虚函数来实现的)

参数不同表现在 参数类型不同 数量不同 顺序不同 都不同
#include<iostream>

name managling 名字改编
c++为了支持重载 需要名字改编
extern “C”表示不进行名字改编
C语言不支持名字改编 所以也不支持函数重载
在c++向c的转换过程中 加上extern “C”就可以了
例 extern “C” void fun(int a)
实现c与c++的混合编程

带默认形参值的函数

int fun(int a,int b=5){ return a+b;}int fun(int a,int b,int c);int main(void){  cout<<fun(3)<<endl;  cout<<fun(3,4)<<endl;  cout<<fun(3,4,5)<<endl;  return 0;}int fun(int a,int b,int c){ return a+b+c;}

引用
是给
变量 名称+空间
引用不是变量 仅仅只是变量的别名 没有自己独立的空间 对引用的改变就是对变量的改变

#include<iostream>using namenspace std;int main(void){ int val=100; int &refval=val;//引用在定义的时候必须初始化 refval=200;//实际上改变的是对val进行的改变 cout<<"val=:"<<val<<endl; return 0;}

引用一经初始化不能重新指向其他变量
例如;int val2=500;
refval=val2;//不能重新引用其他变量 只代表将val2赋值给val
也就是val变成了500

在 一般用作参数传递和返回值

const引用是指向const对象的引用
const int val=1024;
const int& refval=val; 0k
int& ref2=val;error val是一个常量无法转换成非const的引用
如果允许的话 则 ref2=200是合法的 也就是改变了常量val的值了 这是错误的

同样 valref=200也是错误的 因为它是一个常量不能赋值

int val2=1024const int& ref3=val2;//const可以指向非const对象  但这也是不能更改的 double val3=3.14;const int& ref4=val3;cout<<"ref4:"<<ref4<<endl;cout<<"val3:"<<val3<<endl;

结果一个是3 一个是3,14 但这并不矛盾

因为 const int& ref4=val3; 等价于 int temp=val3; const int& ref4=temp;

参数传递 值传递 形参不能更改形参
指针传递可以

引用传递

void swap(int& x,int& y){  int temp=x; x=y; y=temp;}int main(void){ int a=5; int b=6; swap(a,b);//在函数调用时,引用被初始化}引用的另一个作用是用于返回引用的函数int a[]=(0,1,2,3,4);int& index(int i){ return a[i];}index(3)=100;//引用作为函数返回值 使得函数可以放在赋值运算符左边              //函数返回值引用,引用在函数返回的时候初始化。注意不能返回局部变量

引用与指针的区别
一个直接访问 一个间接访问
指针是变量 有自己的地址空间 保存的是它所指向变量的地址 内存空间4个字节
引用一经初始化不能再引用其他变量 而指针可以
最主要的原因在于在进行值传递的时候 实参要初始化形参 将实参内容拷贝到函数
引用传递 初始化形参时不分配空间 也就不用调用函数 效率更高
指针传递 本质是值传递 实参初始化形参的时候 也是要初始化空间的 32位系统是 4个字节 64位的就是8字节的空间 如果要修改指针的地址时候 单纯使用指针传递是不行的 * &

内联函数
用inline关键字修饰的函数
因为执行函数调用时 系统要建立栈空间 保护现场 传递参数和控制程序执行的转移 这些工作需要系统时间和空间的开销
但是把函数代码写进程序时 又会显得很重复
于是 inline 内联函数 在调用内联函数时 函数的调用工作是编译器执行的 不涉及到函数调用的开销 、

inline int max(int a,int b){ return a>b?a,b;}

内联函数和带参数宏区别
要求实参和形参的一致


常量 const
带参数的宏(类似与函数调用的) inline

c++高层次编程
c底层编程

新的类型转换运算符

const int val=100;int n=const_cast<int>(val)n  errorint n=val;okconst_cast 一般用于指针和引用int& p=const_cast<int*>(&val);*p=200;

使用const_cast不是为了修改变量 通常是为了函数能够接受这个参数

static_cast
隐式转换 编译器可以自动完成的 一般来说是安全的 int a; short b; a=b是ok的
显示转换(强制转换)
const_cast<类型比如int>(3,14)
static
reinterpert
dynamic

编译器隐式执行的

程序 编写程序是为了让计算机 解决现实生活的实际问题
用一定的数据来表示
按照一定的逻辑来来处理这些数据

Pascal之父 结构化程序设计先驱 程序=算法+数据结构
程序是完成一定功能的一序列有序指令的集合
指令=操作码+操作数
指令按一定的顺序进行整合 就形成了程序
程序就是按照一定的逻辑进行数据处理
机器语言 汇编语言

机器语言进行编程 更多站在机器的角度解决问题 而不是解决问题本身的空间来考虑问题 将现实生活中要处理的数据 我们不得不用二进制进行表示 我们施加的逻辑也不得不用一定的二进制逻辑进行表示 更多是按照机器的思维来解决问题 我们的思维被束缚了
汇编语言将机器指令映射成一些可以被人读懂的助记符
但抽象层次还是比较低 大部分的时候还是要机器思维考虑 比如寻址方式
高级语言屏蔽了机器细节 抽象程度更高

汇编语言和机器语言
代码与数据的界限模糊
面条式的编程方法

传统的程序设计是面向过程的 程序=算法+数据结构
自上而下的编程思想 结构化程序设计采用自顶向下 将系统视为分层的子程序的集合 可以将程序分为功能不同的模块 使得整个程序有条理性 但是很多数据仍然属于整个程序 因而结构化程序设计思想还是需要有很多的全局变量 在某个地方进行更改 所以会对整个程序产生难以预料的影响

考虑问题的时候以算法为中心 而不是以数据为中心
要求一个软件负责人 他了解整个系统的任务分配
当问题复杂度超过了个人能理清各个子程序的调用关系时

缺陷 程序难以管理
数据修改存在问题
程序可重用性差
不适合大型软件的开发
缺点的根源在于数据和代码是分离的

面向对象的程序设计
程序=对象+对象+对象
对象=数据+算法

封装、继承、多态

面向对象是认识事务的一种方法

结构化设计刚发应用的是过程抽象 将问题域中具有明确功能定义的操作抽取出来 并将其视为一个实体看待

数据抽象是较过程抽象更高级别的抽象方式 将描述客体的属性和行为绑定在一起 实现统一的抽象 从而达到对现实世界客体的真正模拟

对象———实体
类————–抽象类别
从计算机的观点看对象
对象是计算机内存中的一块区域
这些内存不单存储数据 也存储代码
对象之间通过函数调用
当对象的一个函数被调用时 对象执行内部的代码来响应 程序执行后的结构和行为就是该对象的功能

抽象是人们认识事物的一种方法
抓住事物的本质 而不是内部具体细节或具体实现 将具体的事物到一般的过程 归纳或是归类的思想

对象共同的特征 —>类(归类)
大类—->小类 (分类)

封装
插座 插口 插头插入插座上的插口就能够获得电流(搞不清内部的电流哪里来的)
使用者更加专注了 对象是对我们更好的服务

继承 就是拿来主义

继承具有传递性

多态 同一个消息被不同对象接收时 产生不同的结果 就是不同的行为

就是同一接口 不同方法
绘图 矩形和圆
继承和多态组合 可以生成很多相似但又独一无二的对象

面向对象思想总结
面向对象是一种认识世界的方法

面向对象编程方法的特性
重点在数据而不是函数
开闭原则 对增加开放 对修改、删除关闭 外界就不会使得使用该对象的原有系统发生改变

优缺点 易维护 质量高 效率高 易拓展 运行效率可能会低一点
站在问题空间来解决问题的一种思考方式

类声明
class 类名称

0 0