如果你上理论课也听不懂老师在讲什么
不如现在开始自学一些吧
期末再看看速成课
一定可以过的
Good Luck!
1、C++相对于C语言的不同
(1)C语言强调编程的算法,而面向对象(OOP)强调数据
(2)面向对象编程:将数据和方法合并在一起的类,并且具有继承与派生,多态等特性。继承是从旧类中派生出新类,多态为运算符和函数创建多个定义,通过编程上下文来确定使用哪个定义。
2、类(class)
类是具有相同属性和行为的一组对象的集合,它为属于它的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分,类是对象集合的再抽象。
3、类与实例(对象)的关系
组成类的对象均为此类的实例(Instance), 类是多个实例的综合抽象,实例是类的个体实物。
eg:
人类的定义:
class HUMANKIND { char *name; //特征、属性、数据成员 double weight; //特征、属性、数据成员 public: void eat( ); //行为、操作、函数成员 void wear( ); //行为、操作、函数成员 void sleep( ); //行为、操作、函数成员 void travel( ); //行为、操作、函数成员 };
人类的实例:HUMANKIND XiaoMing;
4、头文件
C++为了兼容C,支持所有的C头文件,但为了符合C++标准,所有的C头文件都有一个C++版本,即去掉.h,并在名字前面加c。如 <cstring> 、 <cmath>、<cstdlib>,而<stdio.h>则是换成了<iostream>。
5、命名空间
假设有这样一种情况:一个班上有两个叫 Myon 的学生时,如何区分?
可用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等。
同样这样的情况也可能出现在 C++ 中:比如有两个相同的变量m,编译器就无法判断你使用的是哪个变量m,为了解决这个问题,我们就引入了“命名空间” ,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。
本质上,命名空间就是定义了一个范围。
定义方式:
namespace name(命名空间名) { //代码声明 } 使用方式: (1)name::code; //code可以是变量或函数 (2)using name::code; (3)using namespace name;
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
来看个简单的例子
namespace A { int a = 10; } namespace B { int a = 20; } #include <iostream> using namespace std; int main() { cout <<B::a << endl; cout <<A::a << endl; }
这样我们就实现了区分不同库中的相同名称
namespace A { int a = 10; } namespace B { bool a = true; //布尔类型我们后面会讲 } #include <iostream> using namespace std; int main() { using namespace A; cout << a << endl; cout<<B::a << endl; }
将前面的最后一句代码改为
cout << boolalpha <<B::a << endl;
就会打印出bool类型的true或false
6、输入输出
C语言的输入输出主要是scanf()、printf()函数,而C++ 则是使用类对象cin、cout进行输入输出。
cin>> :istream对象,标准输入流对象
cout<< :ostream对象,标准输出流对象
endl:换行,并清空输出缓冲区(end line 结束一行,并另起一行)
\n照样可以在cout中使用
对于”>>” ,如果需要连续输入多个数据,可以有两种方法:
(1)每行只输入1个数据,以换行符结束(即输完一个数据敲一次回车)。
我们还是先来看一个简单的例子
#include <iostream> using namespace std; int main() { int a, b; //定义了两个整数 cin >> a >> b; //输入两个数 cout << a <<endl<< b; //输出我们输入的这两个数(中间<<endl是换行) }
如果将<<endl去掉,输出的结果就不会换行
(2)一行输入多个数据,数据间用空格符隔开,以换行符结束一行数据的输入。
#include <iostream> using namespace std; int main() { char buf[32]; int a; cin >> buf >> a ; cout << buf << a ; }
7、位运算
(1)按位与(&)
(2)按位或(|)
(3)按位异或(^)
(4)取反(~)
(5)左移(<<) 右移(>>)
8、基本数据类型
C++和C的基本数据类型几乎一样:
char short int float double unsigned signed
但是C++中新增了一种数据类型:bool(布尔类型)
布尔类型对象可以被赋予文字值true或false,所对应的关系就是真与假的概念,即1,0
可以使用 boolalpha 打印出bool类型的true或false
看例子
bool compare(int a, int b) { return a > b; } #include <iostream> using namespace std; int main() { bool a = false; //a为假,即a=0 cout << sizeof(bool) << endl; //输出bool类型的字节数 cout << "a = " << a << endl; //这种用双引号引起来的内容会被直接原样输出 cout << "a = "<< boolalpha << a << endl; //打印出bool类型的true或false cout << "compare = " << boolalpha << compare(7, 5) //判断a大于b的真假 << endl; }
由输出结果可见,布尔型变量只有一个字节。
9、结构体和三目运算符
在C语言中,定义结构体变量时struct关键字不能省略,但是在C++中是可以省略的。
C struct Test Myon; //对 Test my; //错
C++ struct Test Myon; //对 Test my; //也是对的,关键字struct可以省略
三目运算符:XX ? XX : XX
在C语言中,条件表达式只能做右值
int c = a > b? a:b; //C和C++中都可以
而在C++中,条件表达式能做左值和右值
a > b? a:b = 520; //只能是用在C++中,在C语言中这样写是错的
看例子
#include <iostream> using namespace std; struct Test { int num; }; int main() { Test first; first.num = 101; int a = 2, b = 0; (a > b ? a : b) = first.num; //相当于*(a>b?&a:&b)=101 cout << "a = " << a << endl; }
C语言中,表达是不能作为左值,因为表达式返回的是值
但C++可以,因为其返回的是变量本身
即C++编译器对三目运算符做了增强工作,返回的是值的地址
相当于*(a>b?&a:&b)=101
10、for循环
C++中引入了基于范围的for循环,for循环后的括号由冒号“ :”分为 两部分,第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
一般用法:
#include <iostream> using namespace std; int main() { int arr[] = { 1,2,3,4,5,6 }; for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) cout << arr[i] << "\t"; //\t表示空4格,相当于tab键 }
新用法:
#include <iostream> using namespace std; int main() { int arr[] = { 1,2,3,4,5,6 }; for (int i : arr ) cout << i << "\t"; }
特点:从数组的第一个元素开始,逐个赋值给迭代变量 ,不依赖于下标元素,通用。
11、const
C语言中的const并不是真正的常量,是只读变量,有自己的存储空间,只是表示const修饰的变量不能作为左值,常量的值可以通过指针被间接改变。
而C++中的const常量,存在符号表中,没有存储空间,当对常量取地址操作时,会另外开辟内存空间。
#include <iostream> using namespace std; int main() { const int a = 10; int* p = (int*)&a; printf("a===>%d\n",a); *p = 11; printf("a===>%d\n", a); }
通过指针修改了a的值,但输出却没有变 。
12、类型别名typedef
为一个已有的数据类型另外命名,称为typedef声明
语法形式: typedef 已有类型名 新类型名表;
typedef int Area;
//声明Area为int的别名
typedef int (*DoubleIntFunction) (double);
//声明 DoubleIntFunction为“有一个double形参、返回值为int的函数的 指针”类型的别名
DoubleIntFunction funcPtr;
//声明一个具有该类型的名称为 funcPtr的函数指针,可以指向一个已经存在的函数代码的起始地址
#include <iostream> using namespace std; int transform(double a) { return int(a); } int main() { typedef int Area; typedef int (*DoubleIntFunction) (double);//声明DoubleIntFunction为“有一个double形参、返回值为int的函数的指针”类型的别名 DoubleIntFunction funcPtr; //声明一个具有该类型的名称为funcPtr的函数指针,可以指向一个已经存在的函数代码的起始地址 funcPtr = transform; cout << (3.5) << endl; Area a = 12; cout << "a=" << a << endl; }
总的来说1~10还是比较好理解的吧,但是11和12我自己其实还没太想清楚,可能也有点不好理解,不过这也是刚开始学嘛,慢慢来,C++后面的内容会继续更新,这是我自学过程的记录,也希望对初学C++的朋友能有所帮助,C++程序设计这门课一定不能挂!