C++入门基础

1、预处理器指示行(以#号开始的行):它们由预处理器读取并忽略,并不会生成任何代码。
2、计算机的内存是以字节(byte)为单位组织的,一个字节(byte)是我们在C++中能够操作的最小的内存单位。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。
3、C++的变量声明,它可以在源程序中任何地方声明变量。
4、与普通数据类型不同的一点是,要想声明和使用字符串类型的变量,需要引用头文件<string>,并且使用using namespace语句来使用标准名空间(std)。
5、像变量一样,常量也是有数据类型的。默认的整数字常量的类型为int型。我们可以通过在后面加字母u或者l来迫使它为(unsigned)的类型或长整型(long)。
6、#define指令不是代码语句,它是预处理器指令,因此指令行末尾不需要加分号。
7、sizeof():这个运算符接受一个输入参数,该参数可以是一个变量类型或一个变量自己,返回该变量类型或对象所占的字节数。
8、控制台交互
控制台(console)是电脑的最基本交互接口,通常包括键盘(keyboard)和屏幕(screen)。键盘通常为标准输入设备,而屏幕为标准输出设备。
在C++的iostream函数库中,cin给输入使用和cout给输出使用。
9、字符串流(stringstream)
标准头文件<sstream>定义了一个叫做stringstream的类,使用这个类可以对基于字符串的对象进行像流(stream)一样的操作,这对将字符串与数值互相转换非常有用。
string mystr("1204");
int myint;
stringstream(mystr) >> myint;
10、在某些情况下需要在一个函数内控制一个函数以外的变量,此时必须使用按地址传递参数。每一个变量的类型后面跟了一个地址符ampersand sign (&),它的作用是指明变量是按地址传递的(by reference),而不是像通常一样按数值传递的。当按地址传递一个变量的时候,我们是在传递这个变量本身。
使用举例:
void duplicate (int& a, int& b, int& c)
{
a*=2;
b*=2;
c*=2;
}
11、按地址传递是一个使函数返回多个值的有效方法。比如:
void prevnext(int x, int& prev, int& next)
{
    prev = x - 1;
    next = x + 1;
}
12、函数重载的必要条件:它们用不同数量的参数,或不同类型的参数。
13、inline函数
inline指令可以被放在函数声明之前,要求该函数必须在被调用的地方以代码形式被编译。这相当于一个宏定义。它的好处只对短小的函数有效,这种情况下因为避免了调用函数的一些常规操作的时间,如参数堆栈操作的时间,所以编译结果的运行代码会更快一些。
14、将数组作为参数传给函数,在C++中将一整块内存中的数值作为参数完整的传递给一个函数是不可能的,但是允许传递它的地址,传递地址更快速有效。例如如下函数:
void procedure(int arg[])
15、与表示单个字符常量的单引号不同,双引号是表示一串连续字符的常量,由双引号引起来的字符串末尾总是会被自动加上一个空字符('\0')。
16、数组的概念与指针的概念联系非常紧密,其实数组的标识相当于它的第一个元素的地址,就像一个指针相当于它所指向的第一个元素的地址。
int numbers[20];
int* p;
p = numbers;
numbers是一个指针常量,数组名的确是一个指针常量。
17、指针初始化
int number;
int *tommy = &number;
相当于:
int number;
int *tommy;
tommy = &number;
18、空指针
指针void是一种特殊类型的指针,它可以指向任意类型的数据,唯一一个限制是被指向的数值不可以被直接引用,因为它的长度是不定的,因此必须使用类型转换操作或赋值操作来把void指针指向一个具体的数据类型。
19、指针和结构组成的各种可能的组合
(1)pmovie.title 结构pmovie的元素title
(2)pmovie->title 指针pmovie所指向的结构其元素title的值(*pmovie).title
(3)*pmovie.title 结构pmovie的元素title作为指针所指向的值 *(pmovie.title)
20、定义自己的数据类型 typedef,比如:
typedef char* string_t;
21、范围操作符 ::
22、在c++中类和数据结构的概念太相似,所以这两个关键字struct和class的作用几乎是一样的,两者定义的唯一区别在于由class定义的类所有成员的默认访问权限为private,而struct定义的类所有成员默认访问权限为public。
23、操作符重载
要想重载一个操作符,只需要编写一个成员函数,名为operator,后面跟我们要重载的操作符,遵循以下原型定义:
type operator sign(parameters);
24、关键字this
关键字this通常被用在一个class内部,指正在被执行的该class的对象在内存中的地址。它是一个指针,其值永远是自身object的地址。
25、静态成员
一个class的静态数据成员的内容不依赖于某个对象,对同一个class的所有object具有相同的值。
它们不能够使用关键字this,因为this实际引用了一个对象指针,但这些static函数却不是任何object的成员,而是class的直接成员。
26、在C++中,一个class可以从多个class中继承属性或函数,只需要在子类的声明中用逗号将不同基类分开就可以了。比如:
class CRectangle: public CPolygon, public COutput{}
27、虚拟成员:如果想在基类中定义一个成员留待子类中进行细化,我们必须在它前面加关键字virtual,以便可以使用指针对指向相应的对象进行操作。比如:
在基类中virtual int area(void){return 0;}
关键字virtual的作用就是在当使用基类的指针的时候,使子类中与基类同名的成员在适当的时候被调用。
28、在一个抽象类中,可以对它不定义,而简单得在函数声明后面写=0.
比如:virtual int area(void)=0;
这种函数被称为纯虚拟函数,而所有包含纯虚拟函数的类被称为抽象基类。
抽象基类的最大不同是它不能够有实例,但我们可以定义指向它的指针。
29、函数模板
模板使得我们可以生成通用的函数,这些函数能够接受任意数据类型的参数,可返回任意类型的值,而不需要对所有可能的数据类型进行函数重载。
它们的原型定义可以是下面两种中的任何一个:
template <class identifier> function_declaration;
template <typename identifier> function_declaration;
调用时的方法:function <type> (parameters);
30、类模板:使得一个类可以有基于通用类型的成员,而不需要在类生成的时候定义具体的数据类型。
31、名空间:
使用名空间(namespace)可以将一组全局范围有效的类、对象或函数组织到一个名字下面。换种说法,就是它将全局范围分割成许多子域范围,每个子域范围叫做一个名空间。
名空间的作用在于全局对象或函数很有可能重名而造成重复定义的错误,名空间的使用可以避免这些错误的发生。
32、reinterpret_cast<new_type> (expression)类型转换
reinterpret_cast可以将一个指针转换为任意其它类型的指针,这个操作符可以在互不相关的类之间进行指针转换,操作的结果是简单的将一个指针的二进制数据复制到另一个指针,对指针指向的内容不做任何检查或转换。举例:
class A{};
class B{};
A* a = new A;
B* b = reinterpret_cast<B*>(a);
33、static_cast<new_type>(expression)类型转换
static_cast允许将一个引申类的指针转换为其基类类型,同时也允许进行相反的转换,还可以被用来进行类中明确定义的转换,以及对基本类型的标准转换。
class Base{};
class Derived: public Base{};
Base* a = new Base;
Derived* b = static_cast(a);
或者:
double d = 3.14159265;
int i = static_cast<int>(d);
34、dynamic_cast<new_type>(expression):完全被用来进行指针的操作。它可以用来进行任何可以隐含进行的转换操作以及它们被用于多态类情况下的方向操作。与static_cast不同的是,dynamic_cast会检查后一种情况的操作是否合法,也就是说它会检查类型转换操作是否会返回一个被要求类型的有效的完整的对象。
这种检查是在程序运行过程中进行的。如果被转换的指针所指向的对象不是一个被要求类型的有效完整的对象,返回值将会是一个空指针null。
35、typeid:返回一个类型为type_info的常量对象指针,可以通过name()函数获得一个描述数据类型或类名称的字符串。比如:
CDummy* a,b;
type(a).name()返回:class CDummy*
type(b).name()返回:class CDummy
36、预处理指令
(1)#define:用来生成宏定义常量。#define name value
(2)#undef:取消对传入的参数的宏定义
(3)#ifdef:可以使一段程序只有在某个指定常量已经被定义了的情况下才被编译,无论被定义的值是什么。
#ifdef name
//code here
#endif
(4)#ifndef:在指令#ifndef和#endif之间的代码只有在某个常量没有被定义的情况下才被编译。
(5)#line:控制编译器在出错时显示文件中的行数以及我们希望显示的文件名,格式为:
#line number "filename"
(6)#include:
#include "file":编译器首先在包含这条指令的文件所在的目录下进行寻找,如果找不到文件,编译器再到被配置的默认路径下进行寻找。
#include <file>:编译器会直接到默认标准头文件路径下寻找。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值