\documentclass[a4paper,12pt]{article} \usepackage[utf8]{inputenc} \usepackage[UTF8]{ctexcap} \usepackage{amsmath} \usepackage{amsfonts} \usepackage{amssymb} \usepackage{xcolor} %opening \title{C++学习笔记} \author{行走的芦苇} \begin{document} \maketitle %\begin{abstract} %\end{abstract} \section{基本概念} 在协作完成一个大的软件时,应如何合理地设计程序结构,并保证每一个子程序之间都能正确地共享和交换数据,这是编程的\textcolor{red}{核心问题}。 程序员的任务是将计算表达出来,并且做到: \begin{itemize} \item 正确 \item 简单 \item 高效 \end{itemize} 一个看似矛盾的事实:关注代码结构和代码“质量”是程序取得成功的最快捷径。\\ 程序的组织体现了程序员的编程思路、目前手段主要是把大的计算任务划分为许多小任务,这一技术主要包括两类方法。 \begin{itemize} \item[抽象]:即不需要了解的程序具体实现细节被隐藏在相应的接口后边 \item[分治]:把一个大问题分为几个小问题分别解决 \end{itemize} 对于一个好的程序员和系统设计师,软件的\textbf{结构问题}是在开发过程中始终要关注的最重要问题。 将问题不断的分解、细化,直到问题小到能够被我们很好的理解和解决为止\\ 表达式是程序的最小组成单元,表达式就是从一些操作数计算一个值。\\ 左值:一个变量;右值,一个变量的值\\ 符号常量表示那些在初始化后值不再改变的数值量。\\ 表达式语句主要包括赋值语句、I/O语句和函数调用。声明语句呢?? 除了合法输入情况以外,程序必须经过各种非法输入的检验。\\ switch语句括号中值必须是整型、字符型或枚举类型。特别的,不能使用字符串型\\ \begin{verbatim} char* ca = reinterpret_cast(&a); \end{verbatim} 判定一个自然数是质量的方法: 对于任一自然数$N$,$0 =3$ \item[判定]对于$\forall M~~2(x)| 当一个函数被调用时,编译器分配一个数据结构,保存所有参数和局部变量的拷贝,这样的数据结构称为函数活动记录(function activation record),每个函数的活动记录都有自己特有的详细布局。 递归(recursive) 活动记录栈(stack of activation record);调用栈(call stack) 一个constexpr函数和普通函数行为相同,但若在需要一个常量的位置处使用它,则有所不同,此时若传递的参数是常量表达式,则计算在编译时完成。为使该机制可行,要求constexpr函数必须非常简单。在C++11中,函数体只有包含一条return 语句;在C++14中,还可以写简单的循环语句。 一段代码中,创建变量的顺序与销毁的顺序相反。 \textcolor{red}{\verb|v[++i]=i|}是有很大的问题:不同的编译器不一定给出警告,不同的优化方法产生的结果可能不同,不能保证赋值符左边的子表达式一定先于右边的计算。 \begin{verbatim} //file1 int x1 = 1; int y1 = x1+2 //file2 extern int y1; int y2 = y1 + 2; \end{verbatim} 这段代码的问题是:使用了全局变量;全局变量名字太短;全局变量使用了复杂的初始化。\par \begin{verbatim} const Data& default_date() { static const Deat dd(1970,1,2); } \end{verbatim} 一个静态的局部变量只在首次调用时才被初始化;使用引用,消除了不必要的对象拷贝;使用常量引用,可以防止调用者无意中改变对象的值。 \section{编码错误} \begin{verbatim} double my_abs(int x) { if (x < 0) return -x; else if (x > 0) return x; } \end{verbatim} 这种情况下,当$x=0$会返回无效值 Program to an interface, not an implementation. Favor object composition over class inheritance. There are important differences between these techniques. Object composition lets you change the behavior being composed at run-time,but it also requires indirection and can be less efficient. Inheritance lets you provide default implementations for operations and lets subclasses override them. Parameterized types let you change the types that a class can use. But neither inheritance nor parameterized types can change at run-time. Which approach is best depends on your design and implementation constraints. \end{document}