前言
本笔记只是记录一些比较简单的随堂随笔,部分内容涉及基础知识的,将会在其他篇文章进行论述。本笔记随时间推移与知识积累不断更新
- C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。
- C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点。
初步分析
所有的 C++ 程序都有以下两个基本要素:
程序语句(代码):这是程序中执行动作的部分,它们被称为函数。
程序数据:数据是程序的信息,会受到程序函数的影响。
初步了解–通过输出“Hello World”来看看。
#include <iostream>
using namespace std;
int main(){
cout << "Hello World"; // 输出 Hello World
return 0;}
using namespace std;可以声明也可以不声明,其本身就是一个对象。但不声明其余代码需要加上std::才能够正常使用。
c++的关键字与c有所同而有所不同,总结如下:
其他的数组,整形变量、字符串等与c相差无几,故不再多说。而c++的cstring这个头文件对字符串的分析相对于c的使用指针、数组对字符串进行分析处理更为快捷方便。部分函数如下图:
示例代码如下:
#include <iostream>
#include <cstring>
using namespace std;
int main (){
char str1[11] = "Hello";
char str2[11] = "World";
char str3[11];
int len ; // 复制 str1 到 str3
strcpy( str3, str1);
cout << "strcpy( str3, str1) : " << str3 << endl; // 连接 str1 和 str2
strcat( str1, str2); cout << "strcat( str1, str2): " << str1 << endl; // 连接后,str1 的总长度
len = strlen(str1);
cout << "strlen(str1) : " << len << endl;
return 0;}
引用
引用很容易与指针混淆,它们之间有三个主要的不同:
1. 不存在空引用。引用必须连接到一块合法的内存。
2. 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
3. 引用必须在创建时被初始化。指针可以在任何时间被初始化。
int& r = i;double& s = d;
在这些声明中,& 读作引用。因此,第一个声明可以读作 “r 是一个初始化为 i 的整型引用”,第二个声明可以读作 “s 是一个初始化为 d 的 double 型引用”。
示例代码:
#include <iostream>
using namespace std;
int main (){
// 声明简单的变量
int i;double d; // 声明引用变量
int& r = i;double& s = d;
i = 5;
cout << "Value of i : " << i << endl;
cout << "Value of i reference : " << r << endl;
d = 11.7;
cout << "Value of d : " << d << endl;
cout << "Value of d reference : " << s << endl;
return 0;}
析构函数与构造函数的生死情结
- 概念不同:对象所在函数调用完毕时,系统自动执行析构函数。而构造函数是一种特殊的方法。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。
- 作用不同:析构函数被调用而构造函数为对象成员变量赋初始值。
- 目的不同:析构函数担任着”清理善后” 的工作。而构造函数主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
换一种方法注释
c语言与c++,注释有时是不能重叠,不能一一对应的,所以可以用预处理的方法:if 0与endif进行大规模注释更有优越性。例如引入头文件的时候,为了防止多次导入同个头文件而导致编译错误,可以使用一下的方法注释头文件。
特殊符号::的奥妙
"::“在C++中表示作用域,和所属关系。”::"是运算符中等级最高的,它分为作用域符号(”::“的前面为类名称,后面则是该类的成员名称,C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分。)、全局作用域符号(当全局变量在局部函数中与其中某个变量重名时可以用::来区分)、::作用域分解运算符(声明了一个类A,且在类A里声明了一个成员函数voidf(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成voidA::f(),表示这个f()函数是类A的成员函数。)
与“.”在普通类的中的使用不同的是,“->”是指针的指向运算符,通常与结构体一起使用。例如定义了一个名为stu的指针,然后在主函数用(struct stu s; )定义一个名为s的结构体指针,需要使用时可以直接使用(s->**)来调用。
数据流可分为:cout(输出流)、cin(输入流)、cerr(错误流)、clog(日志流)。具体也难以区别,但最常用的是cout与cin。
面向对象,春暖花开
类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。类与对象的关系就如模具和铸件的关系 类的实例化结果就是对象,而对一类对象的抽象就是类,类描述了一组有相同属性和相同方法的对象。
访问控制
访问数据类型可分为:公有继承(public)、保护继承(protected)、私有继承(private)。多继承即一个子类可以有多个父类,它继承了多个父类的特性。
多继承
C++ 类可以有多个类继承成员,语法如下:
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…{
<派生类类体>};
示例代码:
#include <iostream>
using namespace std; // 基类
Shapeclass Shape {
public:
void setWidth(int w){
width = w; }
void setHeight(int h){
height = h; }
protected:
int width;
int height;}; // 基类
PaintCostclass PaintCost {
public:
int getCost(int area){
return area * 70; }}; // 派生类
class Rectangle: public Shape, public PaintCost{
public:
int getArea(){
return (width * height); }};
int main(void){
Rectangle Rect;
int area;
Rect.setWidth(5);
Rect.setHeight(7);
area = Rect.getArea(); // 输出对象的面积
cout << "Total area: " << Rect.getArea() << endl; // 输出总花费
cout << "Total paint cost: $" << Rect.getCost