1、typedef为一个已有类型取一个新的名字。
2、c++中的标识符:用来标识变量、函数、类、模块或任何其他用户自定义项目的名称。
3、局部变量:在函数或者代码块内部定义的变量(在函数内局部变量会覆盖全局变量的值)
全局变量:在所有函数外部声明的变量
形式参数:在定义函数名和函数体的时候使用的参数,用来接收调用该函数时传递的参数,也就是实参。只在调用的时候才分配内存单元,调用结束后释放空间,只在函数内部有效
实际参数:调用某函数时要传递给某函数的参数。
4、定义常量两种方法::#define(在函数头之后函数体之前)和const
5、存储类:
auto:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。
register:用于定义存储在寄存器中而不是 RAM 中的局部变量。
static:指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。
extern:
6、函数声明中参数的名称不重要,但是一定要有参数的类型
7、lambda函数:对匿名函数的支持
8、传递数组的三种方式:
现在初始化一个数组,例int a[3] = {1,2,3}
b = myFunction(a)
void myFunction(int *param) { . . . }
void myFunction(int param[10])
{
.
.
.
}
void myFunction(int param[])
{
.
.
.
}
9、指针数组
#include <iostream>
using namespace std;
const int MAX = 4;
int main ()
{ const char *names[MAX] = { "Zara Ali", "Hina Ali", "Nuha Ali", "Sara Ali", };
for (int i = 0; i < MAX; i++)
{ cout << "Value of names[" << i << "] = ";
cout << names[i] << endl; }
return 0; }
在char类型数组中输出names[i]是直接输出值而不是地址的解释如下:
“
这个很好理解,我们来将问题拆分一下,首先是定义个字符串:char *name = "
Zara Ali";
那么定义完成之后*name
得到的就应该是Z
,因为Z存储的是字符串的首地址,它的类型是指向字符的指针,表达式*name
拿到的正是这个地址中存储的字符Z
。
然后是定义字符串数组:char *name[] = {
"Zara Ali", "Hina Ali", "Nuha Ali", "Sara Ali",};
name
中存储的其实是一堆指针,这一堆指针组成了一个数组,其中name[0]
这个指针正是第一个字符串的首地址,然后*(name[0])
又回到第一个问题中了
”
在c++中,*的优先级小于[]
10、引用——某个已存变量的别名
引用很容易与指针混淆,它们之间有三个主要的不同:
- 不存在空引用。引用必须连接到一块合法的内存。
- 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
- 引用必须在创建时被初始化。指针可以在任何时间被初始化。
关于c++中使用引用的原因:
主要在于形参实参传递值这块。
形参实参都是变量名的时候,形参的改变不会改变实参的值u,换句话说是单向,而如果形参是指针或者引用,当是指针时,指针指向实参的首地址,会进而改变实参的值,而引用的地址和实参地址相同,所以也会改变实参的值,这样就是双向传递。
“
(1)将变量名作为实参和形参。这时传给形参的是变量的值,传递是单向的。如果在执行函数期间形参的值发生变化,并不传回给实参。因为在调用函数时,形参和实参不是同一个存储单元。// 同 c
(2) 传递变量的指针。形参是指针变量,实参是一个变量的地址,调用函数时,形参(指针变量)指向实参变量单元。这种通过形参指针可以改变实参的值。// 同 c
(3) C++提供了 传递变量的引用。形参是引用变量,和实参是一个变量,调用函数时,形参(引用变量)指向实参变量单元。这种通过形参引用可以改变实参的值。
”
11、定义类成员函数两种方式:
(1)class a (2) int a::B(void)
{ {
int B(void) }
{}
}
使用第二种方法时,应该先在类中声明类函数,在写该函数时前边应该是返回值的类型
12、什么是构造函数?
类中的一种特殊成员函数,命名和类名相同,声明时直接就是:类名()
定义时:类名::类名()
{
}
如果构造函数无参数,那么在主函数实例化对象的时候就直接实例化就行,但是如果有参数的话就得这样:Line line(10)
13、什么是析构函数?
删除所创建对象时执行,函数名与类名相同,前边有个~
14、什么是拷贝构造函数?
如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。
Line( const Line &obj); //类名(const 类名 &obj)
15、this指针:
每一个对象都可以通过this指针访问自己的地址,友元函数没有this指针,只有类的成员函数才有this指针
this指针在成员函数开始前构造,成员函数结束后清除;
16、c++类的静态成员在类中声明static int objectCount;但是不能再类中初始化,在类的外边初始化的时候int Box::objectCount = 0;(其中objectCount为静态成员)
静态函数只要使用类名家范围解析运算符::就可以访问;静态成员函数只能访问静态成员数据、其他静态成员函数和类外部的其他函数。
静态成员函数与普通成员函数的区别:
- 静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。
- 普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针。
17、继承
依据一个类定义一个类,代表is a关系。优点:创建和维护一个应用程序变得更容易。达到了重用代码功能和提高执行时间的效果。
格式:class Rectangle: public Shape
一个派生类继承了所有的基类方法,但下列情况除外:
- 基类的构造函数、析构函数和拷贝构造函数。
- 基类的重载运算符。
- 基类的友元函数。
18、函数重载:在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。
****运算符重载:
19、c++接口:
C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。
如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。
// 纯虚函数 virtual double getVolume() = 0;