1、初始化所有指针。

2、

(1)指向常量的指针:

(2)常量指针:指针本身为常量:

3、若循环体内部包含有向vector对象添加元素的语句,则不能使用范围for循环。

4、字符数组要注意字符串字面值结尾处还有一个空字符。

5、数组的指针及数组的引用

6、C++中多维数组指的是数组的数组。

7、要使用for循环语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应是引用类型。

8、异常检测&异常处理

throw&try(catch)

9、如果函数无需改变引用形参的值,最好将其声明为常量引用。

10、(1)构造函数

是成员函数的一种,可以有参数,不能有返回值(void也不行)。

作用是对对象进行初始化,例如给成员变量赋初值。若定义类时没有写构造函数,编译器会生成默认的无参数的构造函数,不进行任何操作。

对象生成时构造函数自动被调用,对象一旦生成,就不能在其上执行构造函数。

一个类可以有多个构造函数。

(2)拷贝构造函数

几个原则:

C++ primer p406 :拷贝构造函数是一种特殊的构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用。当定义一个新对象并用一个同类型的对象对它进行初始化时,将显示使用拷贝构造函数。当该类型的对象传递给函数或从函数返回该类型的对象时,将隐式调用拷贝构造函数。

X::X( X& )
X::X(const X &)

二者选一,后者能以常量对象作为参数。

C++支持两种初始化形式:

拷贝初始化 int a = 5; 和直接初始化 int a(5); 对于其他类型没有什么区别,对于类类型直接初始化直接调用实参匹配的构造函数,拷贝初始化总是调用拷贝构造函数,也就是说:

A y = x;  //拷贝初始化,是初始化语句非赋值语句,会调用拷贝构造函数,与下一条代码等价
A y(x); //调用拷贝构造函数

必须定义拷贝构造函数的情况:

只包含类类型成员或内置类型(但不是指针类型)成员的类,无须显式地定义拷贝构造函数也可以拷贝;有的类有一个数据成员是指针,或者是有成员表示在构造函数中分配的其他资源,这两种情况下都必须定义拷贝构造函数。

什么情况使用拷贝构造函数:

类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数:

  • (1)用一个对象去初始化同类的另一个对象。
  • (2)若某一个函数有一个参数是类A的对象,那么该函数在被调用时,类A的拷贝构造函数将被调用。
  • (3)如果函数的返回值是类A的对象,则函数返回时,A的拷贝构造函数将被调用。

(3)特殊的构造函数:类型转换构造函数:

实现类型的自动转换。

特点:只有一个参数,且不是拷贝构造函数。在使用时,编译系统会自动调用,建立一个临时对象/临时变量。

(4)析构函数

特点:名字与类名相同;前面加~;没有参数和返回值;一个类最多有一个析构函数。

对象消亡时自动被调用:释放分配的空间

编译期自动生成的缺省析构函数不涉及释放用户申请的内存释放等清理工作。

对象数组的生命期结束时,对象数组的每个元素的析构函数都会被调用到。

先构造的后析构。

11、静态成员 static:静态成员变量、静态成员函数,不需通过对象就能访问,本质是全局的。

普通成员变量每个对象各自有一份,静态成员变量一共一份,被所有成员共享。必须在定义类的文件中对静态成员变量进行一次说明/初始化,否则编译能通过,链接无法通过。

  sizeof运算符不会计算静态成员变量。

calss CMyclass {
int n;
static int s;
};
则 sizeof(CMyclass) =

普通成员函数必须具体作用域某个对象,而静态成员函数并不具体作用于某个对象

  • 静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。
  • 普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针。

12、类的多继承之环状继承

13、纯虚函数

想要在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。

告诉编译器,函数没有主体,上面的虚函数是纯虚函数

14、常引用不能对实参值进行改变。

  指向常量的指针,也叫指针常量,该指针变量指向的是一个常量,指针所指的常量不允许改变,但是该指针可以指向其他地址。

  常量指针又叫常指针,指的是声明的一个指针变量是一个常量,不可通过常量指针改变其指向的内容。但是该指针所指的对象是可以发生改变的。

  不能把常量指针赋值非常量指针,反过来可以。除非强制类型转换,例如:(int *)

  函数参数为常量指针时,可以避免不小心改变参数指针所指向地址的内容。

15、用new实现动态内存分配

分配变量:P=new T; eg:

int *p;
p=new int;
*pn=;

分配数组:P=new T[N];

int *p;
p = new int[;
p[]=;

new的返回值类型 T*

用delete释放内存空间:

delete p;
delete []p;

16、内联函数:

函数调用都是有开销的,若某个函数执行快但被调用很多次,开销大,使用内联函数。编译器处理对内联函数的调用语句时,将整个函数代码插入到调用语句处,而不会产生调用函数的语句。

inline int max(int a,int b)
{
if(a>b) return a;
return b;
}

内联成员函数:(1)inline  (2)将整个函数体放在类定义的内部

17、函数重载:一个多个函数,名字不同但参数个数或参数类型不同。

18、类成员可访问范围

public public protected

类的成员函数内部可以访问:(1)当前对象的全部属性、函数 (2)同类其他成员的全部属性、函数

类的成员函数以外的地方只能访问类对象的公有成员(public)

19、负数用十六进制表示,首先将其表示为二进制,变反码再变补码

20、成员对象

成员对象:一个类的成员变量是另一个类的对象。包含成员对象的类叫封闭类

使用初始化列表设计封闭类的构造函数:类名::构造函数(参数表):成员变量1(参数表),成员变量2(参数表),......{......}

成员函数初始化列表里的参数:任意复杂的表达式;函数/变量/表达式中的函数,变量有定义。

当封闭类对象生成时,先执行所有成员对象的构造函数,再执行封闭类的构造函数。成员对象的构造函数调用顺序与成员对象在类中的说明顺序一致,与在成员函数初始化列表中出现的顺序无关。

21、友元(friend)

(1)友元函数:一个类的友元函数可以访问该类的私有成员;将一个类的成员函数(包括构造、析构函数)定义为另一个类的友元。

(2)友元类:A是B的友元类,则A的成员函数可以访问B的私有成员。Note:友元类之间的关系不能传递、不能继承。

22、this指针:指向成员函数所作用的对象

Note:静态成员函数中不能使用this指针!因为静态成员函数并不具体作用于某个对象,因此静态成员函数的真实参数个数就是程序中写出的参数个数。

23、常量

(1)常量对象 const

(2)常量成员函数:类的成员函数说明后面可以加const。

  执行期间不应修改其所作用的对象,因此,常量成员函数中不能修改成员变量的值(静态成员变量除外),也不能调用同类的非常量成员函数(静态成员函数除外)。

Note:两个成员函数,名字和参数表都一样,但一个是const,则算函数重载。

(3)常引用 const int &r = n

  不能通过常引用改变其引用的变量 ,一般可作为函数参数。

void PrintObj(const Sample &o)

C++类、函数、指针的更多相关文章

  1. c++特性:指向类成员的指针和非类型类模板参数和函数指针返回值 参数推导机制和关联型别

    一.c++允许定义指向类成员的指针,包括类函数成员指针和类数据成员指针 格式如下: class A { public: void func(){printf("This is a funct ...

  2. 类成员函数指针 ->*语法剖析

    在cocos2d-x中,经常会出现这样的调用,如 ->*,这个是什么意思呢,如下面得这个例子: , 其实这是对类的成员函数指针的调用,在cocos2dx中,这种形式多用于回调函数的调用.如我们经 ...

  3. C++ 类的成员函数指针 ( function/bind )

    这个概念主要用在C++中去实现"委托"的特性. 但现在C++11 中有了 更好用的function/bind 功能.但对于类的成员函数指针的概念我们还是应该掌握的. 类函数指针 就 ...

  4. C++的类成员和类成员函数指针

    类成员函数指针: 用于访问类成员函数,和一般函数指针有区别. 类成员函数处理的是类数据成员,声明类成员函数指针的同时,还要指出具体是哪个类的函数指针才可以.调用时也要通过对象调用. 而对于类的静态成员 ...

  5. 使用std::function 把类成员函数指针转换为普通函数指针

    前言 这是改造前一篇 设计模式 的基础,使通知者不必知道观察者的类名和函数名,只需要知道更新函数的原型即可. 开发环境:WIN7 32位 + VS2010 发现在VS2005中使用std::funti ...

  6. C++中怎么获取类的成员函数的函数指针?

    用一个实际代码来说明. class A { public: staticvoid staticmember(){cout<<"static"<<endl;} ...

  7. Qt信号槽机制的实现(面试的感悟,猜测每一个类保存的一个信号和槽的二维表,实际使用函数指针 元对象 还有类型安全的检查设定等等)

    因为面试时问了我这道题,导致我想去了解信号槽到底是如何实现的,于是贴着顺序看了下源码,大致了解了整个框架.网上关于信号槽的文章也很多,但是大部分都是将如何应用的,这里我就写一下我所理解的如何实现吧, ...

  8. VB6/VBA中跟踪鼠标移出窗体控件事件(类模块成员函数指针CHooker类应用)

    一.关于起因 前几天发了一篇博文,是关于获取VB类模块成员函数指针的内容(http://www.cnblogs.com/alexywt/p/5880993.html):今天我就发一下我的应用实例. V ...

  9. 获取VB类模块成员函数指针(转)

    最近在做一些VB6.VBA的项目,被如何获取类模块中的函数指针这个问题所困扰,收集整理后,有2分资料值得收藏,特将关键部分留存,以备后续查找. 参照连接1:http://www.cnblogs.com ...

  10. C/C++ 类成员函数指针 类成员数据指针

    普通函数指针:  "return_type (*ptr_name)(para_types) " 类成员函数指针: "return_type (class_name::*p ...

随机推荐

  1. Redis批量查询模板

    场景 在开发的时候经常会遇到批量取缓存的问题,例如查询商品信息 传入一个商品Id列表,查询Redis数据存在则放入返回列表 不存在的数据查找数据库,并放入Redis 上面两步数据整合返回 伪代码为 l ...

  2. Django之模型层第二篇:多表操作

    Django之模型层第二篇:多表操作 一 表关系回顾 ​ 在讲解MySQL时,我们提到,把应用程序的所有数据都放在一张表里是极不合理的. ​ 比如我们开发一个员工管理系统,在数据库里只创建一张员工信息 ...

  3. 使用命名管道承载gRPC

    最近GRPC很火,感觉整RPC不用GRPC都快跟不上时髦了. gRPC设计 刚好需要使用一个的RPC应用系统,自然而然就盯上了它,但是它真能够解决所有问题吗?不见得,先看看他的优点: gRPC是一种与 ...

  4. SQLAlchemy01 /SQLAlchemy去连接数据库、ORM介绍、将ORM模型映射到数据库中

    SQLAlchemy01 /SQLAlchemy去连接数据库.ORM介绍.将ORM模型映射到数据库中 目录 SQLAlchemy01 /SQLAlchemy去连接数据库.ORM介绍.将ORM模型映射到 ...

  5. Django之重写用户模型

    django——重写用户模型 Django内建的User模型可能不适合某些类型的项目.例如,在某些网站上使用邮件地址而不是用户名作为身份的标识可能更合理. 1.修改配置文件,覆盖默认的User模型 D ...

  6. tensorflow实现lstm中遇到的函数记录

    函数一:initializer=tf.random_uniform_initializer(-0.1, 0.1, seed=123) tf.random_uniform_initializer 参数: ...

  7. Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?

    从接触 Python 时起,我就觉得 Python 的元组解包(unpacking)挺有意思,非常简洁好用. 最显而易见的例子就是多重赋值,即在一条语句中同时给多个变量赋值: >>> ...

  8. 拦截器(Interceptor)中的invocation.invoke()是什么意思?

    拦截器(Interceptor)中的invocation.invoke()是什么意思? 最佳答案: invocation.invoke() 就是通知struts2接着干下面的事情 比如 调用下一个拦截 ...

  9. npm\cnpm\yarn\tyarn 关于源和代理的问题

    npm 是一个包管理器.Node.js 自带. cnpm 是 npm 的阿里版,用的阿里源. yarn 是另一个包管理器,不自带,需要另外装.可以单独装,也可以用 npm 装. tyarn 是 yar ...

  10. 简单理解:数据库的一致性与四种隔离级别(+MySQL实现)

    并行数据库存在着几种常见不一致问题: 1.更新丢失:两个并发的写进程同时修改某内容,一个没修改完提交之后另一个又提交,导致其覆盖了第一个提交的写进程内容. 2.脏读:一个操作读到了另外一个操作没有提交 ...