c++学习笔记

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值