SQL学习笔记(二)

数据库安全性

授权与收回

GRANT

1
2
3
4
5
GRANT <权限>[,<权限>]...
ON <对象类型><对象名>[,<对象类型><对象名>]...
TO <用户>[,<用户>]...
[WITH GTANT OPTION];
-- WITH GRANT OPTION表示获得了某种权限的用户还可以把这种权限授予其他用户,但不能循环授予
阅读全文 »

SQL学习笔记(一)

学习示例

Student

Sno Sname Ssex Sage Sdept
201215121 李勇 20 CS
201215122 刘晨 19 CS
201215123 张敏 18 MA
201215125 张立 19 IS

Course

阅读全文 »

自制3D打印机SUPERCUBE:第一篇:原材料采购

SUPERCUBE

选择supercube主要是i3的y轴在底板的有时可能会不稳,框架式的后期加装亚克力板整体也会好看一些,而且会有拓展性(例如挤出头换笔或者激光头)

um2看着也很好,但是我还算是新手,难度有点大,预算也稍高一点

阅读全文 »

C++:单例封装log4cpp

log4cpp是一个开源C++日志类库,可以方便使用日志和调试。

官方主页

安装

1
2
3
4
5
6
7
8
9
#1.官网下载压缩包
#2.解压
tar zxvf log4cpp-x.x.x.tar.gz
cd log4cpp/
#安装
./configure
make
make check
sudo make install

默认lib库路径:/usr/local/lib/

阅读全文 »

C++:让一个类只能在堆/栈上创建对象

在C++中,类的对象创建有两种形式,一是静态创建,如A a;另一种是动态创建,如A *p=new A;

静态创建一个类对象,是由编译器为对象在栈空间中分配内存。

动态创建对象,是使用new运算符将对象创建在堆空间中。

动态创建又分为两步:

  1. operate new()函数在堆空间找到合适内存并分配

  2. 调用构造函数构造对象,初始化内存空间

operate new()

在说创建对象前,先聊一下operate new()的重载。

如果不想使用系统原始的内存分配方式时,可以自定义内存分配方式。

阅读全文 »

C++:空指针访问类方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
using std::cout;
using std::endl;

class NullPointerCall
{
public:
void func1()
{ cout << "func1()" << endl; }

void func2(int ix)
{ cout << "ix = " << ix << endl; }

void func3(/* NullPointerCall* const this */)
{ cout << "_ix = " << this->_ix << endl; }

private:
int _ix;
};


int main(void)
{
NullPointerCall * p = nullptr;
p->func1();//NullPointerCall::func1(p);
p->func2(10);// NullPointerCall::func2(p, 10);
//p->func3();//error p->func3(p);

NullPointerCall np;
np.func1();//NullPointerCall::func1(&np);
np.func2(10);
np.func3();//np.func3(&np);
return 0;
}

C++:单例模式

单例模式简单来说就是整个程序运行时只能创建出一个对象。

核心办法:构造函数私有化

单例模式还分为两种:饿汉模式和饱汉模式

饿汉模式:程序运行直接创建对象(线程安全)

饱汉模式:使用对象时,若不存在创建对象(线程不安全)

双检测锁:解决饱汉模式线程不安全问题

饱汉模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Singleton
{
public:
static Singleton * getInstance()
{
if(_pInstance == nullptr)
{
_pInstance = new Singleton();
}
return _pInstance;
}

static void free()
{
if(_pInstance)
{
delete _pInstance;
}
}

void print() const
{ cout << "Singleton::print()" << endl; }

private:
Singleton(){ cout << "Singleton()" << endl; }
~Singleton() { cout << "~Singleton()" << endl; }

static Singleton * _pInstance;
};

//静态变量必须类外静态初始化
Singleton * Singleton::_pInstance = nullptr;

饿汉模式

阅读全文 »

C++:lambda表达式

lambda表达式其实就是匿名函数,即没有函数名的函数

形式

1
[capture list](parpmeter list)->return type{funcition body}
  • capture list(捕获列表)是一个lanbda所在函数中定义的局部变量的列表(通常为空)
阅读全文 »

C++:强制类型转换

C中类型转换

1
2
3
4
5
double x = 2.333;
int y = (int)x;
int z = int(x);

char* a=(char*)malloc(sizeof(char)*8);

旧式类型转换不明了,查找错误较为困难,C++中建议使用C++风格的类型转换

cast-name<type>(expression)

阅读全文 »

C/C++:type用法详解

用途一:类型别名

1
2
typedef char* PCHAR;
PCHAR pa,pb;//等价于 char *pa,*pb;

用途二:struct别名

1
2
3
4
5
6
//c中不能用是struct [类名]来定义,不能只用类名,typedef可以简化代码
typedef struct{
int x;
int y;
}rectangle;
rectangle p;
阅读全文 »
0%