C++盲点

const

const指针

1 char greeting[] ="hello";
2 char* p = greeting; // non-const pointer, non-const data
3 const char* p = greeting; // non-const pointer, const data
4 char* const p = greeting; // const pointer, non-const data
5 const char* const p = greeting; //const pointer, const data
1 void f1(const Object* o);
2 void f2(Object const* o); 

这两个是一样的;

const vector<int>::iterator更像是T* const;

vector<int>::const_iterator更像是const T*;

enum不能取地址,const可以取地址,define没有任何约束;

const函数是为了可以操作const对象;

 1 class Test {
 2 public:
 3     void print() const {}
 4     void mut() const { m1 = 1; }
 5 private:
 6     mutable int m1; // can be changed even in const functions
 7 };
 8 const Test t;
 9 t.print();
10 t. mut(); //legal

const版本和非const版本的代码重用。实现const函数,在non-const函数中调用const版本。

1 class Test {
2 public:
3    const int& operator[](int i) const {...}
4     int& operator[](int i) {
5         const_cast<int&>(static_cast<const Test&>(*this)[i]);
6     }
7 }; 

singleton的初始化实现

local static 能够确保在调用时已经初始化。但是仍然不能确保线程安全。所有non-const的static对象,无论它是local还是non-local,在多线程环境下都会有问题。解决的方法就是在一开始的单线程环境下,手动调用这些函数实现初始化。这样可以避免与初始化有关的race conditions。

1 class Test {
2 public:
3    Test& test() {
4         static Test t;
5         return t;
6     }
7 };    

virtual

多态的析构函数,设成virtual,这样在delete的时候才会释放子类的所有资源。

1 class Parent {
2 public:
3     virtual ~Parent() {...}
4 };
5 class Child1: public Parent {};
6 Parent* p = new Child1;
7 delete p;

多态的析构函数必须是virtual。

在析构函数里,尽量不要调用会发生异常的操作。如果有,也要提供额外的接口,让用户有机会自己调用处理。

不要在构造函数或析构函数里调用virtual 函数。此时调用virtual函数,调用的是base类的版本。

线程安全;

时间: 2024-12-18 07:41:06

C++盲点的相关文章

C语言盲点笔记1

寥寥数笔,记录我的C语言盲点笔记,仅仅为以前经历过,亦有误,可交流. 1.int* a和int *a有差别吗? 没有不论什么差别,都表示a是int指针 建议这么写int *a;这样明显一点 理由例如以下 int *a,b; a是指针,b是整形,一幕了然 可是你假设写成int* a,b; 尽管a还是指针,b还是整形 可是a前面没直接跟*.一不留神.还真把b看成指针了 2.C语言中和单片机C语言的数据类型char,前者是字符串类型,后者和int一样是8位的数据类型3.c语言malloc申请结构体内存

NSRunLoop原理详解——不再有盲点

阅读目录 RunLoop整体介绍 RunLoop消息类型(事件源) RunLoop模式 RunLoop生命周期 Runloop嵌套 编程最怕的就是有盲点,不确定,而runloop官网对其提及的又很少:那么看完这篇应该使你有底气很多~ RunLoop整体介绍 An event-processing loop, during which events are received and dispatched to appropriate handlers. 事件运行循环:就类似下面的while循环部分

基础知识盲点——2

1.Jquery方法blur()失去焦点 2.选择文字后高亮::selection属性 3.a.toString().replace(/^(\d)$/, "0$1") .($1指的就是符合你第一个括号里的正则的数据,如果a是1个数字,转换成2位数,前面以0补充) 4.给div设置高的时候,如果设置为百分比,都没有用,它由内部的内容的高决定.如果设置为px,则不管div内部有无东西都会是有效地,但是有人教了我一个方法,就是将html和body的高度都设置为100%的时候,给空的div设置

学习盲点

1:在输入时,尽量不要一个字符一个字符输入,应换成字符串.由于enter键算一个字符.(3中可证明) 2.scanf仅仅输入字符串时,空格表示结束! 3.#include <stdio.h> char a[100010]; int main(int argc, char *argv[]) { longint M,T,i,j; intU,F,D,q,e=0; scanf("%ld%ld%d%d%d",&M,&T,&U,&F,&D); f

【PHP代码审计】 那些年我们一起挖掘SQL注入 - 8.全局防护盲点的总结下篇

0x01 背景 现在的WEB应用对SQL注入的防护基本都是判断GPC是否开启,然后使用addlashes函数对单引号等特殊字符进行转义.但仅仅使用这样的防护是存在很多盲点的,接上篇http://www.cnbraid.com/2016/05/10/sql6/,这里介绍另外两种情况.盲点如下:①FILES注入,全局只转义掉GET.POST等传来的参数,遗漏了FILES:②变量覆盖,危险函数:extract().parse_str().$$. 0x02 漏洞分析 FILES注入 FILES注入一般情

【PHP代码审计】 那些年我们一起挖掘SQL注入 - 7.全局防护盲点的总结上篇

0x01 背景 现在的WEB应用对SQL注入的防护基本都是判断GPC是否开启,然后使用addlashes函数对单引号等特殊字符进行转义.但仅仅使用这样的防护是存在很多盲点的,比如最经典的整型参数传递,也即被带入数据库查询的参数是整型.数组中的key没过滤被带入了查询以及全局过滤了GET.POST但没过滤SERVER或COOKIE引发的注入.所以看似有全局防护,实则隐藏了很多“后门”-盲点如下:①注入点类似id=1这种整型的参数就会完全无视GPC的过滤:②注入点包含键值对的,那么这里只检测了val

Javascript基础知识盲点总结——继承

原性链继承方法中,javascript是通过另一个类的实例进行继承的(实际是用一个构造器函数的实体去覆盖另一个对象的原型).如下代码: TwoDShape.prototype = new Shape(); Triangle.prototype = new TwoDShape(); 需要直接用new Shape()构造一个实体,然后才能通过该实体的属性完成相关的继承工作,而不是直接继承自Shape()构造器. 这中方法也确保了对Shape()进行任何修改都不会影响TwoDShape(),因为后者继

字符串的基本操作,初始化和赋值之类的区别,和数据名是一个常量指针不可以改变和赋值(盲点众多)

#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h> //一级指针的典型用法 //数组 int a[10] //字符串 //1 C语言的字符串 以零结尾的字符串 //2 在C语言中没有字符串类型 通过字符数组 来模拟字符串 //3 字符串的内存分配 堆上 栈上 全局区 (很重要) //字符数组 初始化 void main51() { //1 指

字符串一级指针的内存模型图(盲点,以前自己懵懂)

#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h> void main61() { char buf[20]= "aaaa"; //定义并且初始化 char buf2[] = "bbbb"; char *p1 = "111111"; char *p2 = malloc(100); s

Javascript基础知识盲点总结——数据类型和数组

一.javascript总的基本类型 1.javascript中的基本类型共有五种:数字.字符串.布尔值.undefined.null 其中null和undefined最大的区别在于,被赋予null的变量通常被认为是已经定义了的. 2.除了以上五种基本类型外,其他的数据类型都属于对象. 二.利用typeof方法查看数据类型 在javascript中可以通过typeof方法来查看某个变量或值得数据类型.该方法会返回一个代表数据类型的字符串,可能返回的值包括:number,string, boole