C++基础(一)

1、基本概念

逐语句和逐过程调试区别

单步调试(F11)时会自动跳到ostream文件中解决办法:
运行到cout时不要点击“逐语句”(F11),而改为逐过程(F10)。

模板函数

模板函数的声明和实现应放在同一个文件中。

C++空类大小

C++标准规定,凡是一个独立的对象必须具有非0大小,因此C++空类的大小不为0,大小为1。(原因:new需要分配非0的内存大小;避免处以sizeof(T)时得到除以0错误)
若子类继承空类,子类有自己的数据成员,空基类的一个字节并不会加到子类中去。
若一个类包含另一个空类对象数据成员,考虑字节对齐。

C++多态的实现

C++多态是指类间存在继承关联时,调用成员函数会根据调用函数对象的类型来执行不同的函数。
虚函数是指在基类中使用关键字virtual声明的函数,在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数;即在程序中可以根据所调用的对象类型来选择调用的函数,称之动态链接或后期绑定。
C++通过虚函数实现多态。
多态实现的三个条件:存在继承关系;父类指针指向子类对象;子类重写父类的虚函数。(告诉编译器不要根据指针类型判断如何调用方法,而根据指针所指向的实际对象类型来判断如何调用,即在运行时再去确定调用函数)
**多态的实现原理:**当类中声明虚函数时,编译器会在类中生成一个虚函数表,虚函数表是一个存储类成员函数指针的数据结构,虚函数表是由编译器自动生成与维护的,virtual成员函数会被编译器放入虚函数表中,存在虚函数时,每个对象中都有一个指向虚函数表的指针(vptr指针)。

当在类中定义虚函数时,产生虚表;
定义了虚函数,对象大小会多出4个字节,多个虚函数也只有多一个4字节,可见定义了虚函数即多出一个指向虚表的指针;
虚表中存储函数地址,每个地址占用4个字节,有几个虚函数,就有几个地址;
将父类的析构函数定义为虚函数,则在delete指向子类的父类指针时,会先调用子类的析构函数,再调用父类的析构函数。
纯虚函数:=0,告诉编译器函数没有主体为虚函数。
在构造函数中调用虚函数,不能实现多态。
包含纯需函数的类为抽象类,不能被实例化。
在这里插入图片描述
参考:c++编译器对多态的实现原理总结

回调函数

我想调用一个函数,但是我必须给这个函数传入一个函数做为参数,这个函数是由调用方提供给被调用方,让被调用方去调用的,称之为回调函数。【回调函数(callback)是什么

我想写作业,但我不会,我调用你的方法并给你我的引用,然后你调用我的接口帮我把作业写了。

2、常用功能

string 到 int 的转换方法

方法一:使用C标准库的atoi

#include<cstdlib> // atoi的头文件
#include<string>
std::string text = "152";
int number = std::atoi(text.c_str());

if (errno == ERANGE) //可能是std::errno
{
//number可能由于过大或过小而不能完全存储
}
else if (errno == ????)
//可能是EINVAL
{
//不能转换成一个数字
}

方法二:使用stringstream(实现各种类型的转换)

#include<sstream>
#include<string>
std::string text = "152";
int number;
std::stringstream ss; // stringstream ss(str); 读取str中的单字
ss<<text; 
ss>>number; // string -> int
if (! ss.good())
{
//错误发生
}
ss << number; // int->string
string str = ss.str(); // ss.str(s): 用s 初始化ss, 类似于流输入;ss.str():当前stream 内容产生一份string类临时对象的copy。注意由于返回临时对象,则在整个表达式结束后将会被析构
if (! ss.good())
{
//错误发生
}
// 使用stringstream时的清空操作
ss.str("");

方法三:采用sscanf

int nResult;
nResult = sscanf(str_tmp.c_str(), "%d", &int_tmp);
if (nResult!=1)
{//转换不成功的处理
}
// 这样可以判s断是否转换成功。 

计时

  • clock() 返回的是程序的cpu耗时,无法计算挂起阻塞以及gpu耗时,因此clock()一般适用于单线程纯cpu且不包括sleep的耗时计算
  • 因此c++程序中更推荐采用steady_clock,直接记录当前时间,然后计算时间间隔

方法一:clock()

#include <time.h>

clock_t begin;
clock_t end;

begin = clock();
...
end = clock();

double duration = ((double)(end - begin)) / CLOCKS_PER_SEC; // 单位s

// CLOCKS_PER_SEC 不同的编译器取值不同 windows下为1000,linux下为1000000

方法二:chrono::steady_clock

#include <chrono>   
using namespace std;
using namespace chrono;

chrono::steady_clock::time_point start = chrono::steady_clock::now();
// do something...
chrono::steady_clock::time_point end   = chrono::steady_clock::now();
auto duration = duration_cast<microseconds>(end - start);
cout << "程序用时=" << duration.count() << "微秒" << endl;

3、C++关键字

const

注意指向常量的指针与常指针的区别。
const int * p1; // p1是指向常量的指针,意味着指针指向的内容不可变,指针本身可变
int * const p2; // p2是常指针,意味着指针本身不可变,指针指向的内容可变

int ii=0;  
const int i=0; //i是常量,i的值不会被修改  
const int *p1i=&i; //指针p1i所指内容是常量,可以不初始化 
int * const p2i=&ii; //指针p2i是常量,所指内容可修改  
const int * const p3i=&i; //指针p3i是常量,所指内容也是常量  
p1i=&ii; //合法  
*p2i=100; //合法  

参考资料:

  1. const的几种使用方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值