自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 收藏
  • 关注

转载 高质量c++(有了malloc/free 为什么还要new/delete )

有了malloc/free 为什么还要new/delete ?malloc 与free 是C++/C 语言的标准库函数,new/delete 是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象在消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在

2015-09-30 17:31:09 375

转载 迷途指针

C中的野指针,C++中的迷途指针(失控指针或悬浮指针)都是不为NULL的指针,也不是指向常量的指针,而是指向“垃圾”内存的指针。“垃圾”的意思是未知区域、未知内存。 例如,当我们定义一个指针的时候:void main(){ int *p;}p的值为0xcccccccc。也就是说,任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱 指一气。所以,指针变量在创建的同时应

2015-09-30 17:20:02 394

原创 数组名与指针

#include <iostream>using namespace std;int main(){ int a[] = {1,2,3,4,5}; int b[2][10]={{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}}; //数组名本身就是指针,再加上&,就变成了双指针,这里的双指针的就是指二维数组 int *p = (int *)(&a

2015-09-30 16:14:06 376

原创 数组指针和指针数组

#include <iostream>using namespace std;int main(){ int v[2][10]={{1,2,3,4,5,6,7,8,9,10},{11,12,13,14,15,16,17,18,19,20}}; //定义一个指针a,指针a是一个指向有10个int类型数组的指针 int (*a)[10] = v;//数组指针!!!!!!!

2015-09-30 10:57:08 344

原创 函数指针的应用

实现从3个数中求最大值#include <iostream>using namespace std;int max(int a, int b){ return a>b?a:b;}int main(){ //int max(int, int); int (*p)(int, int) = &max;//!!!!!! int a, b, c, d; cout

2015-09-30 09:17:31 309

转载 new一个类对象和使用类名创建一个对象有什么区别?

new一个类对象和使用类名创建一个对象有什么区别? 用new来给一个类的对象分配空间,和使用类名称来定义一个类的对象,有什么区别?难道区别只是new的返回值是个指针,而对象定义得到的是变量名么?或者是在存储空间上不同?有什么不同呢?具体什么时候使用哪个方法呢? ——解决方案——————–对,存储空间上不同。 new出来的在堆上 直接定义的在栈上 ——解决方案——————–用法似乎高手都喜欢

2015-09-29 09:31:59 6950

原创 继承的访问控制--私有继承

在私有继承中,派生类以私有方式继承基类。基类的公有成员和保护成员在派生类中成为私有成员,它们能被派生类的成员函数直接访问,但不能被类外函数访问,也不能在类外通过派生类的对象直接访问。派生类不能直接访问基类的私有成员,而只能派生类的成员函数中通过基类的公有或保护成员函数间接访问。在设计基类时,通常都要为其私有成员提供能够访问它们的公有成员函数,以便派生类和外部函数能间接访问它们。例如,下面的程序以私有

2015-09-27 23:31:27 498

原创 继承的访问控制--保护继承

一、保护继承在保护继承中,基类的公有成员在派生类中成为保护成员,基类的保护成员在派生类中仍为保护成员,所以,派生类的所有成员在类的外部都无法访问它们。例如,下面程序实现类Derived对基类Base的保护继承,仔细理解保护继承后派生类对象如何访问基类的成员。 在上述代码中,类Base定义了保护成员变量b,类Derived**保护继承**自类Base。在主函数main()中,由类Derived创

2015-09-27 23:01:46 899

原创 继承的访问控制--公有继承

在公有继承中,基类成员的可访问性在派生类中保持不变。基类的私有成员在派生类中还是私有成员,不允许外部函数和派生类的成员函数直接访问,但可以通过基类的公有成员函数访问。基类的公有成员和保护成员在派生类中仍是公有成员和保护成员,派生类的成员函数可直接访问它们,而外部函数只能通过派生类的对象间接访问它们。如以下程序:

2015-09-27 21:39:52 358

转载 面试---内存偏移

下面程序中pb->func();的输出结果?#include <iostream>#include<stdio.h>using namespace std;class M{public: M() {a = 1; b = 2;}; ~M() {}; void func() { cout<<a<<" "<<b<<endl; }//pri

2015-09-27 17:17:41 2864

原创 面试---指针与地址

以下程序中a[q-p] 运行结果?#include <iostream>using namespace std;int main(){ int a[3]={0,1,2}; int *p, *q; p = a; q = &a[2]; cout<<p<<endl; cout<<q<<endl; cout<<q-p<<endl;// q-p的实

2015-09-27 15:24:15 322

转载 C和C++中的存储区域(栈、堆、全局...)

一、预备知识——程序的内存分配: 一个由c/C++编译的程序占用的内存分为以下几个部分:1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,

2015-09-25 21:39:32 381

转载 字节顺序:高位优先(big-endian)和低位优先(little-endian)

字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。基于X86平台的PC机是小端字节序的网络字节序: MSB 高字节前存法 Most Significant Bit (Big Edian)主机字节序: LSB 低字节前存法

2015-09-25 17:41:15 12803

转载 面试---传递动态内存

这个程序测试后会有什么结果?#include <iostream.h>#include<cstring>#include<stdlib.h>using namespace std;void GetMemory(char *p, int num){ p = (char *)malloc(sizeof(char) * num);}int main(){ char *str =

2015-09-25 15:53:16 415

转载 面试---指针和引用的区别

一、指针和引用的定义和性质区别:(1) 指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元,即指针是一个实体;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:int a=1;int *p=&a;int a=1;int &b=a;上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。而下面2句定义了一个整形变量

2015-09-25 11:20:36 4653 6

原创 面试---i++在两个线程分别执行100次,最大值和最小值分别多少

i++只需要执行一条指令,并不能保证多个线程i++,操作同一个i,可以得到正确的结果。因为还有寄存器的因素,多个cpu对应多个寄存器。每次要先把i从内存复制到寄存器,然后++,然后再把i复制到内存中,这需要至少3步。从这个意义上讲,说i++是原子的并不对。如此,假设两个线程的执行步骤如下:1、 线程A执行第一次i++,取出内存中的i,值为0,存放到寄存器后执行加1,此时CPU1的寄存器中值为1,内存

2015-09-24 17:51:51 8754 2

转载 面试---内联函数和宏定义的区别

用内联函数取代宏:1.内联函数在运行时可调试,而宏定义不可以;2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会; 3.内联函数可以访问类的成员变量,宏定义则不能; 4.在类中声明同时定义的成员函数,自动转化为内联函数。内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用,在编译的时候内联函数可以直接被镶嵌到目标代码中。内联函数要做参数类型检查

2015-09-24 15:58:19 9058 1

原创 面试---sizeof

#include <iostream>#include<string.h>#include<stdlib.h>using namespace std;/*结构体的内存空间:a. 当结构体内元素的长度都小于处理器的位数时:以结构体内最长的数据元素为对齐单位,即结构体的长度一定是最长数据元素的整数倍。b. 当结构体内存在长度大于处理器位数的元素时,以处理器的位数为对齐单位,但是结构体内类型相

2015-09-24 15:05:26 1031

转载 面试---const与#define的区别

C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:(1)const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。(2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。(3)在C++ 程序中只使用con

2015-09-23 21:50:14 880

转载 面试---c和c++的区别

C是一个结构化语言,如谭老爷子所说:它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。C++首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进

2015-09-23 17:23:03 1910

原创 面试---在C++ 中调用被 C 编译器编译后的函数,加 extern “C”

C++语言支持函数重载,C 语言不支持函数重载。函数被C++编译后在库中的名字 与C 语言的不同。假设某个函数的原型为: void foo(int x, int y); 该函数被C 编译器编译后在库中的名字为_foo , 而C++ 编译器则会产生像 _foo_int_int 之类的名字。C++提供了C 连接交换指定符号extern“C”来解决名字匹配问题。

2015-09-23 17:08:21 407

转载 面试---(x&y) + ( (x^y)>>1 )求平均数

对于位运算求两个数的平均值问题,(整形数据)int average(int x,int y){return ( (x&y) + ( (x^y)>>1 ) );}给出两个整数,求出结果。 刚开始看到这道题的做法就是x和y转换为二进制,然后计算出结果。在没有办法的情况下这样做也可以得出结果。跟你想象的一点不差,这里确实有捷径。题目中的&和^都是位运算,所以我们有必要研究数据的对位情况。任何数据

2015-09-23 16:30:26 546

原创 面试---16位eax寄存器

#include <iostream>using namespace std;void main(){ unsigned char a = 0xA5; unsigned char b = ~a >> 4+1; printf("b = %d \n",b);}//结果为250//这里的局部变量a放在16位的寄存器中!!!!注意:a虽然是无符号char型,只占一个字节,但

2015-09-23 15:53:49 976

转载 面试---阿拉伯数字金额转汉字

要求将阿拉伯数字转为汉字显示出来(包含单位)几个小的注意点:1、中文字符占两个字节,所以如果用C语言实现,需要用char数组的形式保存单个汉字。2、如果数字中出现连续的零,需要把它替换为单一的零。3、在亿、万、元的前面一个汉字不可以为零(人民币读取方式决定)。4、double数值可分为整数部分和小数部分。小数部分较简单,整数部分需要根据这个数字所在的位数匹配上对应的单位。基本思路如下:分析问题:a

2015-09-22 11:29:38 603

原创 面试---不增加变量,交换两个数值变量的值

一、加减法要想不增加变量,交换两个变量的值,可以做加减乘除运算。用对应的加减法或者乘除法都可以做到。举例:a=5;b=8。加减: a=a+b=5+8=13;b=a-b=13-8=5;a=a-b=13-5=8; a=a-b=5-8=-3;b=a+b=-3+8=5;a=b-a=5-(-3)=8; 同理,乘除。#include <iostream>using namespac

2015-09-22 11:04:31 920

转载 面试---x&(x-1);

1、求下面函数的返回值(微软)int func(x) { int countx = 0; while(x) { countx ++; x = x&(x-1); } return countx; } 假定x = 9999 10011100001111 答案: 8思路: 将x转化为2进制,看含有的1的

2015-09-21 17:33:26 661

原创 MySQL基本操作(一)

1、创建用户CREATE USER 'username'@'host' IDENTIFIED BY 'password';说明: Username:所创建的用户名 host:指定该用户在哪个主机上可以登陆,本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可使用通配符% password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器注:创建用户时

2015-09-18 11:36:37 470

原创 SQLAlchemy (三)---使用操作连接符

建立Python文件alchemy10.py,代码如下:#!/usr/bin/ python#encoding:utf8from sqlalchemy import *from sqlalchemy.orm import *#alchemy5实现创建数据库表格功能from alchemy5 import *#功能:测试操作连接#这里的连接指条件查询的时候,逻辑运算符的连接,即 and or

2015-09-17 21:15:04 879

原创 SQLAlchemy (二)---创建映射

建立Python文件alchemy9.py,代码如下:#!/usr/bin/ python#encoding:utf8from sqlalchemy import *from sqlalchemy.orm import *#alchemy5实现创建数据库表格功能from alchemy5 import *#功能:为数据表创建映射class User(object): def __rep

2015-09-17 21:10:34 919

原创 SQLAlchemy (一)---创建表、插入数据、查询

一、创建数据库表格建立Python文件alchemy5.py,代码如下:#!/usr/bin/ python#encoding:utf8from sqlalchemy import *from sqlalchemy.orm import *#from sqlalchemy.ext.declarative import declarative_base#功能:创建数据库表格,初始化数据库#定义引

2015-09-16 21:28:32 20379

原创 MySQL---外键的用法

可以利用外键创建两个关联的表,代码如下:#!/usr/bin/python# encoding: utf-8import MySQLdb#功能:建数据库和表# 打开数据库连接conn = MySQLdb.connect(host="localhost", user="root", passwd="111111", db="testalchemy")# 使用cursor()方法获取操作游标c

2015-09-16 15:59:33 1235

原创 SQLAlchemy---数据库查询

关键词:query() 、filter() 对于之前建好的user表 可以利用以下代码实现查询:#!/usr/bin python#encoding:utf8# 导入:from sqlalchemy import Column, String, create_enginefrom sqlalchemy.orm import sessionmakerfrom sqlalchemy.ex

2015-09-16 15:52:55 1328

原创 SQLAlchemy---ORM技术

数据库表是一个二维表,包含多行多列。把一个表的内容用Python的数据结构表示出来的话,可以用一个list表示多行,list的每一个元素是tuple,表示一行记录,比如,包含id和name的user表:[ ('1', 'Michael'), ('2', 'Bob'), ('3', 'Adam')]Python的DB-API返回的数据结构就是像上面这样表示的。但是用tuple

2015-09-14 21:40:34 572

原创 SQLAlchemy---操作数据库实例

使用SQLAlchemy可以对原有数据库进行操作,便于管理。1、首先,新建数据库名字为testalchemycreate database testalchemy;2、利用sql语句创建数据表:#!/usr/bin/python# encoding: utf-8import MySQLdb# 打开数据库连接conn = MySQLdb.connect(host="localhost", us

2015-09-14 21:00:28 3461

原创 面向对象实例编程

第一题: 代码如下:#include <iostream>#include<stdio.h>using namespace std;class UniversityObject{ public: virtual char * getSummary() = 0;};class Student:public UniversityObject{ public

2015-09-10 20:34:42 431

转载 面向对象编程的封装、继承、多态

面向对象的三个基本特征是:封装、继承、多态。一、封装封装是对象和类概念的主要特性。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。二、继承面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派

2015-09-10 20:11:46 643

原创 标准模板库(STL)使用---pair

一、概述pair是一种模板类型,定义在头文件utility中。(使用#include < vector >也可以包含)pair包含两个数据成员,两个数据的类型可以不同,基本的定义如下:pair<int, string> p;表示p中有两个类型,第一个元素是int型的,第二个元素是string类型的,如果创建pair的时候没有对其进行初始化,则调用默认构造函数对其初始化。pair<string, st

2015-09-10 12:18:33 639

转载 标准模板库(STL)使用---vector

或许你已经把 C++ 作为主要的编程语言用来解决 TopCoder 上的问题。这意味着你已经简单使用过了 STL,因为数组和字符串都是作为 STL 对象传递给函数。也许你已经注意到了,很多程序员写代码比你快得多,也更简洁。或许你还不是但想成为一名 C++ 程序猿,因为这种编程语言功能很强大还有丰富的库(也许是因为在 TopCoder 的练习室里和竞赛中看到了很多非常精简的解决方案)。无论过去如何,这

2015-09-10 10:02:50 659

转载 漫谈C指针第十七讲---定义函数的指针类型

就像自定义数据类型一样,我们也可以先定义一个函数指针类型,然后再用这个类型来声明函数指针变量。我先给你一个自定义数据类型的例子。#include "stdio.h"typedef int* PINT; /* 为int* 类型定义了一个PINT的别名*/int main(){ int x; PINT px = &x; /* 与“int *px=&x;”是等价的。PINT类型其实就是

2015-09-08 17:52:20 321

转载 漫谈C指针第十六讲---函数调用的指针写法

通过函数指针变量调用函数有了FunP指针变量后,我们就可以对它赋值指向MyFun,然后通过FunP来调用MyFun函数了。看我如何通过FunP指针变量来调用MyFun函数的:/* 自行包含头文件 */void MyFun(int x); /* 这个声明也可写成:void MyFun( int )*/void (*FunP)(int ); /*也可声明成void(*FunP)(int x),但习惯

2015-09-08 16:48:50 491

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除