1 智能指针的类别
(1)auto_ptr(c++98), 弃用
(2)unique_ptr、shared_ptr、weak_ptr
unique_ptr:独占式指针,同一时间内,只有一个指针能指向该对象
shared_ptr:共享式指针,多个指针指向同一对象,最后一个指针被销毁时,这个对象被释放。
weak_ptr:辅助shared_ptr。
2 shared_ptr
2. 1 工作原理
我们可以认为每个shared_ptr都有一个引用计数,无论何时我们拷贝一个shared_ptr,引用计数都会递增。当我们给shared_ptr赋予一个新值或是shared_ptr被销毁,引用计数就会递减,如果shared_ptr的引用计数变为0,它就会调用析构函数,自动释放自己所管理的对象。
auto r = make_shared<int>(42);//r指向的int只有一个引用者
r=q;//给r赋值,令它指向另一个地址
//递增q指向的对象的引用计数
//递减r原来指向的对象的引用计数
//r原来指向的对象已没有引用者,会自动释放
shared_ptr指向的内存何时被释放?
(a)该shared_ptr被释放的时候。
(b)该shared_ptr指向其他对象。
2.2 使用
#include <iostream>
#include <memory>
using namespace std;
int main() {
shared_ptr<int> p1(new int(10)); //定义一个shared_ptr指向值为100的对象
cout << *p1 << endl; //10
shared_ptr<int> p2 = make_shared<int>(100);
cout << *p2 << endl; //100
shared_ptr<string> p3;
p3 = make_shared<string>(3, 'a');
cout << *p3 << endl; // aaa
auto p4 = make_shared<float>(3.14);
cout << *p4 << endl; //3.14
return 0;
}
2 unique_ptr
独占式指针,同一时间内,只有一个指针能指向该对象,当这个unique_ptr被销毁时,它指向的对象也被销毁。
2.1 使用
#include <iostream>
#include <memory>
using namespace std;
int main() {
unique_ptr<int> p1; //可以指向int对象的一个空智能指针
unique_ptr<int> p2(new int(10)); //指向10的unique_ptr
cout << *p2 << endl; //10
unique_ptr<string> p3 = make_unique<string>(3, 'a');
cout << *p3 << endl; //aaa
auto p4 = make_unique<string>(2, 'b');
cout << *p4 << endl; //bb
}
不支持的操作:
(1)拷贝操作
(2)赋值操作
unique_ptr<int> p1; //可以指向int对象的一个空智能指针
unique_ptr<int> p2(new int(10)); //指向10的unique_ptr
// p1 = p2; //不支持赋值
// unique_ptr<int> p3(p2); //不支持拷贝操作
支持的操作:
(1)移动
int main() {
unique_ptr<string> p1(new string("aaa"));
unique_ptr<string> p2 = move(p1); //移动完后,p1为空,p2指向原来p1所指内存
cout << *p1 << endl;
cout << *p2 << endl;
return 1;
}
static的作用
c/c++共有
1):修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见。
2):修饰局部变量时,表明该变量的值不会因为函数终止而丢失。
3):修饰函数时,表明该函数只在同一文件中调用。
c++独有:
4):修饰类的数据成员,表明对该类所有对象这个数据成员都只有一个实例。即该实例归 所有对象共有。
5):用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问它的参数、类的静态数据成员和全局.
简述extern的作用,说明什么时候会使用extern?
extern 可以置于变量或者函数前,以表示这个变量或函数定义在别的文件中,提示编译器在遇到此变量或函数的时候在其他模块寻找其定义。
主要使用方式有两种:
1.如果函数的声明中带有extern,说明这个函数定义在其他文件中,这样的好处是可以取代include”*.h”,在一些复杂的项目中这样使用比较方便
2.C++在变异的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个函数中间名,而c语言则不会,因此会造成连接时找不到对应函数的情况。此时c函数就需要用extern“C”进行链接制定,这告诉编译器,请保持c语言原来的名称,不要生成用于链接的中间函数名。
atoi
int myatoi(const char *p)
{
assert(p!=NULL);
int res =0;
bool negflag = false;
while(*p==' ' || *p == '\t')
p++;
if('+' == *p || '-' == *p)
negflag =(*p++ == '+');
while(isdigit(*p))
res = res*10 + (*p++-'0');
return negflag?(0-res):res;
}