C++基础
文章平均质量分 56
ouyangshima
找到心中的那份自信
技术不牢,地动山摇
展开
-
[C++]智能指针unique_ptr,shared_ptr,weak_ptr
C++中对于动态内存的使用非常严格,一次申请必须对应一次释放,否则将造成内存泄漏。这也要求程序员格外小心,比如如下示例:void getStr() { std::string * pstr = new std::string();//pstr为局部变量 *pstr = "Hello world"; .... return;}当该方法执行完毕后,局部变量p...原创 2020-01-12 00:16:08 · 515 阅读 · 0 评论 -
makefile简单入门
<br />1、弄清楚这个技术可以干什么,包括哪些知识点,通过论坛,博客得知。<br />2、寻找资料进行系统的学习,通过电炉,迅雷来获取PPT,CHM,视频,DOC,原代码,书籍等<br />3、模仿做一两个项目寻找不足,进行突破上更高一台阶。<br /> <br />注意:寻找资料和整理资料是衡量一个人专业水平高低的重要依据。原创 2010-12-29 17:26:00 · 979 阅读 · 1 评论 -
[C++基础]C++笔试题中非常常见的sizeof问题
sizeof 是一个操作符(operator),其作用返回一个对象或数据类型所占的内存字节数。strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。strlen返回的是有效字符串长度,不包含结束符‘\0’。函数strcpy则连‘\0’一起复制。基本类型s...原创 2012-11-29 12:13:50 · 2334 阅读 · 0 评论 -
创建和使用托管程序集(C++)
官网实例托管程序集是一种库,您可以创建该库以便高效地重用代码。 这样,就不必在多个程序中重新实现同样的例程,而只需编写这些例程一次,然后在需要该功能的应用程序中引用它们即可。创建类库项目MathAssembly1.VC++,CLR-->类库,MathAssembly。2.向类库添加类MyMath// MathAssembly.h#pragma onceusing names原创 2013-07-04 21:11:57 · 1465 阅读 · 0 评论 -
[C++基础]对象内存分布--基本
对于C++开发者来说,了解其内存是非常必要的,同时C++的多态(动态绑定)的原理也是很重要的。VS打开工程,右键工程名称—>属性—>c/c++—>命令行—> /d1 reportAllClassLayout空类class emptyClass {};//1 > class emptyClass size(1) ://1 > +-- -//1 &g...原创 2013-08-14 16:36:43 · 1450 阅读 · 0 评论 -
头文件定义格式,项目开发中常用的struct,enum
1.实例/* #pragma once //与编译器相关(换不同的平台),使头文件只被编译一次//使用宏定义避免头文件被多次编译,支持跨平台#ifndef _SAAKAA_DATA_BASE_HEAD#define _SAAKAA_DATA_BASE_HEAD#endif*/#pragma once #ifndef _SAAKAA_DATA_BASE_HEAD原创 2012-11-04 19:28:03 · 2485 阅读 · 0 评论 -
[C++基础]深拷贝和浅拷贝
普通类型对象的拷贝普通类型对象的拷贝很简单,就是值的复制而已。比如:int _tmain(int argc, _TCHAR* argv[]){ int a=1; int b=a; return 0;}类对象的拷贝类对象的拷贝相比于普通类型的拷贝就复杂多了,它存在着各种成员变量。比如://CopyTest.hclass CCopyTest{public: CCo原创 2015-04-27 00:55:26 · 816 阅读 · 0 评论 -
[C++基础]位运算 游戏开发中的应用
位运算的定义:通俗点说,位运算就是对一个整数在计算机中二进制进行操作。任何一个整数都可以用二进度的方式来表示的,不同类型的整数它的位数的长度也不一样,INT8或者char是由8个2进度位表示,INT16或者short是由16个2进度位表示,INT32是由32位状态位表示。位运算在游戏中的应用往往,在游戏开发中做位运算的时候,我关注的主要是某一位的值是0,还是1,而并不是去关注这原创 2014-10-12 19:13:13 · 1786 阅读 · 1 评论 -
[C++基础]位运算应用——创建guid
/*|(按位或):x|y=z(z>=x、y),想想x,y各个二进制位一一对齐,只有对应为上有1,就取1,最后就得到了x,y的更大值。"|"可以简单认为是就获取更大值的操作运算符&(按位与):x|y=z(z<=x、y),想想x,y各个二进制位一一对齐,只有对应为上有0,就取0,最后就得到了x,y的更小值。"&"可以简单认为是就获取更小值的操作运算符>>(按位右移):x|y=z,想想x的二进制位原创 2014-10-22 20:24:49 · 1009 阅读 · 0 评论 -
[C++基础]gcc命令之---静态库和动态库
原文:http://blog.csdn.net/tianshuai11/article/details/7671097#comments一,概念 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂原创 2012-07-04 10:51:09 · 1089 阅读 · 0 评论 -
[C++基础]gcc的基本用法
abbreviation n.缩短,缩写abide v.容忍,忍受abolish vt.废止, 废除(法律、制度、习俗等)absent a.不在场的;缺乏的 a.不在意的absorption n.吸收;专注abstract vt.摘要, 提炼, 抽象化 adj. 抽象的absurd adj.荒谬的,可笑的abundance n.充裕,多量accessory adj.附属的, 补充的, 同谋的, 副原创 2010-05-18 18:44:00 · 10500 阅读 · 0 评论 -
[C++基础]C++11匿名函数Lambda表达式
#include <iostream>using namespace std;int main() { []() { cout << "hello, world" << endl; }(); auto add = [](int a, int b)->int{ return a + b; }; int...原创 2019-07-17 18:44:36 · 262 阅读 · 0 评论 -
[C++基础]虚继承实现原理
在C++中,我们会遇到virtual这个关键字,但是它有两种含义:虚函数和虚继承,它们两个是完全无相关的两个概念。什么是虚继承 虚继承是解决C++多重继承问题的一种手段,从不同途径继承来的同一基类,会在子类中存在多份拷贝。这将存在两个问题:其一,浪费存储空间;第二,存在二义性问题,通常可以将派生类对象的地址赋值给基类对象,实现的具体方式是,将基类指针指向继承类(继承类有基类的拷贝)中的基...原创 2019-04-12 12:54:00 · 1324 阅读 · 0 评论 -
[C++基础]多态虚函数表详解
C++相对其他面向对象语言来说,之所以灵活、高效。很大程度的占比在于其多态技术和模板技术。C++虚函数表是支撑C++多态的重要技术,它是C++动态绑定技术的核心。多态对象创建及内存分布假设有一个基类ClassA,一个继承了该基类的派生类ClassB,并且基类中有虚函数,派生类实现了基类的虚函数。我们在代码中运用多态这个特性时,通常以以下两种方式来使用:(1) ClassA *a = ne...原创 2019-04-02 14:22:18 · 521 阅读 · 0 评论 -
[C++基础]虚析构函数
虚析构函数是为了解决这样的一个问题:基类的指针指向派生类对象,并用基类的指针删除派生类对象。如果某个类不包含虚函数,那一般是表示它将不作为一个基类来使用。当一个类不准备作为基类使用时,使析构函数为虚一般是个坏主意。因为它会为类增加一个虚函数表,使得对象的体积翻倍,还有可能降低其可移植性。所以基本的一条是:无故的声明虚析构函数和永远不去声明一样是错误的。实际上,很多人这样总结:当且仅当类里包含至少一...原创 2019-04-07 23:36:24 · 587 阅读 · 0 评论 -
[C++基础]宏定义中操作符(#,##)的使用
# 和 ## 在宏定义(define)中经常可以看到,是预编译过程中的常用语句##是一个连接符号,用于把参数连在一起 #是“字符串化”的意思。出现在宏定义中的#是把跟在后面的参数转换成一个字符串#define CONVERT(name) #name#define CAT(batman, robin) batman##robin#define make_friend(index) pr...原创 2019-04-01 20:48:15 · 1259 阅读 · 0 评论 -
[C++基础]强制转换运算符dynamic_cast
强制转换运算符是一种特殊的运算符,它把一种数据类型转换为另一种数据类型。强制转换运算符是一元运算符,它的优先级与其他一元运算符相同。语法: dynamic_cast < new-type> ( expression )该运算符把expression转换成new-type类型的对象。new-type必须是类的指针、类的引用或者void *;如果new-type是类指针类型,那么ex...原创 2019-03-30 17:30:35 · 838 阅读 · 0 评论 -
[C++基础]对象内存分布--虚继承
virtual在C++中最大的功能就是声明虚函数和虚基类。虚拟继承是为了解决多重继承下公共基类的多份拷贝问题。虚继承虚继承解决了菱形继承中对派生类拥有多个间接父类实例的情况。虚继承的派生类的内存布局与普通继承很多不同,主要体现在:虚继承的子类,如果本身定义了新的虚函数,则编译器为其生成一个虚函数指针(vptr)以及一张虚函数表。该vptr位于对象内存最前面。vs非虚继承:直接扩展父类虚...原创 2019-03-26 17:28:50 · 755 阅读 · 2 评论 -
[C++基础]C++虚函数
C++相对其他面向对象语言来说,之所以灵活、高效。很大程度的占比在于其多态技术和模板技术。C++虚函数表是支撑C++多态的重要技术,它是C++动态绑定技术的核心。虚函数就是为多态存在的。多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。多态,简单来说,父类的指针可以具有多种形态——当它指向某个子类对象时,通过它能够调用到子类的函数,而非父类的函数...原创 2010-03-20 10:00:00 · 1020 阅读 · 0 评论 -
[C++基础]那些模糊的概念——拷贝构造函数与赋值函数
成员初始化表它放在构造函数名与构造函数体之间,用冒号与函数名部分相分割由于是在编译阶段由编译器将要初始的成员数据域参数建立了对应联系,所以用此法的系统在运行阶段开销较之其他地方都要小的多。const与函数防止本函数修改参数变量 返回值类型 函数名(const 参数,const 参数); 防止本函数修改类对象内部的全局变量 返回值类型 函数名(参数列表) const; ...原创 2013-03-08 20:26:50 · 1177 阅读 · 0 评论 -
[C++基础]随机数,随机种子数
#include #include #include using namespace std;void Test(){ int ran_num = 0; cout<<"不指定seed, "; for(int i=0; i<10;i++) { ran_num = rand()%6; cout<<ran_num<<" ";原创 2014-06-23 18:56:02 · 2385 阅读 · 0 评论 -
[C++基础]内存对齐(字节对齐,结构体对齐)
源码:#include struct stcTest1{ int a; char b; int c;};struct stcTest2{ char a; int b; char c;};struct stcTest3{ int a; char b[9]; int c;};int main(){原创 2012-10-24 10:54:10 · 1083 阅读 · 1 评论 -
[C++基础]C++内存分配那些事
动静态内存分配静态内存分配:编译器在处理程序源代码时(即编译时)分配。动态内存分配:程序执行时调用运行时刻库函数来分配。静态与动态内存分配的两个主要区别:静态对象是有名字的变量,我们直接对其进行操作。而动态对象是没有名字的变量,我们通过指针间接地对它进行操作。 静态对象的分配与释放由编译器自动处理。程序员需要理解这一点,但不需要做任何事情。相反,动态对象地分配与释放,必须由程序原创 2013-03-19 19:25:24 · 1421 阅读 · 0 评论 -
[C++基础]令人头疼的const关键字
const的位置//****************************整型常量************************** const int a=1;//必须赋初始值 int const b=2;//必须赋初始值;完全等价于 const int b=2; //const int c; int const d;//错误;必须有初始值 //a=9+...原创 2012-11-26 13:22:40 · 1019 阅读 · 0 评论 -
[C++基础]cout与wcout,printf与wprintf,ofstream与wofstream关于输出中文的问题解决
#include <iostream>#include <fstream>using namespace std;/*cout和wcout在缺省的C locale下,cout可以直接输出中文,但对于wcout却不行(至少VS 2005下不行)。对于wcout,需要将其locale设为本地语言才能输出中文:wcout.imbue(locale(locale()...原创 2013-06-14 21:43:44 · 2629 阅读 · 0 评论 -
[C++基础]goto的用法
小dome#include #include int main(){ int n=7; number2: printf("hello world\n"); if (n==7) { n=8; printf("n=7 start\n"); goto number0; printf("n=7 end\n"); } else { printf("n=原创 2012-12-28 19:35:05 · 52431 阅读 · 5 评论 -
[C++基础]assert断言
#include //#define NDEBUG#include int main(){ int n=9; assert(n!=9);//assert()括号中的表达式if true则不会出现端断言错误,assertion failed system("pause"); return 0;}void assert( int expression );assert的作原创 2012-12-28 15:05:15 · 1179 阅读 · 0 评论 -
spintf函数把格式化的数据写入到字符串中
sprint()功能1.把其他类型的数据转化成字符串2.字符串连接#include <windows.h> #include <stdio.h>int main(){ /*sprintf 原型:int _cdecl sprintf(char* _Dest,const char* _Format,...) 功能:把格式化的数据写入到_Dest字符串中...原创 2012-12-20 20:59:55 · 2319 阅读 · 0 评论 -
[C++基础]C++内存存储
用类去定义对象时,系统会为每一个对象分配存储空间。如果一个类包括了数据和函数,要分别为数据和函数的代码分配存储空间。按理说,如果用同一个类定义了10个对象,那么就需要分别为10个对象的数据和函数代码分配存储单元,如下图所示。能否只用一段空间来存放这个共同的函数代码段,在调用各对象的函数时,都去调用这个公用的函数代码。如下图所示。显然,这样做会大大节约存储空间。C++编译系统正是这样做...原创 2012-11-08 12:20:45 · 3167 阅读 · 0 评论 -
[C++基础]volatile关键词
volatile概念volatile是易变的、不稳定的意思。volatile关键字和const一样是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。先看看下面的例子: int i=10; int j = i;//(1...原创 2013-08-02 16:30:20 · 1331 阅读 · 0 评论 -
[C++基础]在子类中向父类的构造函数传递参数
//基类:#include <iostream.h>class Animal(){public: Animal(int height,int weight) { cout<<"Animal"<<endl; } void eat() { cout<<...原创 2013-08-14 00:14:41 · 3328 阅读 · 0 评论 -
[C++基础]C++很少人知道的那些细节
1.无符号int自动转换void foo(){ unsigned int a = 6; int b = -20; (a+b > 6)?puts("> 6") : puts("<= 6"); //输出 >6/*这个问题测试你是否懂得 C 语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答案是输出是“>6...原创 2013-08-06 20:22:34 · 1632 阅读 · 0 评论 -
[C++基础]原码/反码/补码、二进制位运算
原码/反码/补码 编码定义实例原码最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。【+100】原=01100100 【+0】原=00000000【-100】原=11100100 【-0】原=10000000注意:在原码中,零有两种表示形式。反码正数的反原创 2014-05-03 12:58:11 · 4820 阅读 · 0 评论 -
C++项目配置——VisualStudio开发环境
0.主要用于添加头文件路径,库文件路径,库.\ :表示当前文件夹(就是.h,.cpp文件所在的文件夹)..\ :表示父文件夹1.配置:debug,release,所有配置(项目中常常需要debug和release两版本) 平台:win32,x64(当引用的是64位的软件/头文件,否则引用的lib会出现错误:.obj文件找不到引用的xx函数)2.常规常规->输原创 2012-11-04 21:50:25 · 3090 阅读 · 0 评论 -
[C++基础]C++4个转型操作符——数据类型转换
static_cast:静态类型转换。编译器在编译期处理;用于基本数据类型之间的转换。 dynamic_cast:动态类型转换。运行期间确定类型;用来执行继承体系中“安全的向下转型或跨系转型动作”. 参见 const_cast:常量类型转换。编译器在编译期处理;把cosnt或volatile属性去掉,用来将对象的常量性去除。用来将类型的const、volatile和__unaligned属性移...原创 2013-01-18 13:42:47 · 1520 阅读 · 0 评论 -
[C++基础]C++笔试面试的题目类型
关键词static,const修饰成员变量,成员函数,输入参,返回值,volatile,内存管理new、delete、malloc、free;delete-delete[]的区别;内存分配(堆区,栈区,静态区,常量区),内存泄露,函数返回指针问题,数据类型class-struct区别;指针-引用的区别;sizeof,strlen(), 字符串编程 字符串倒序;...原创 2013-08-12 21:00:56 · 1198 阅读 · 0 评论 -
[C++基础]C++中静态成员函数如何访问非静态成员
#include <iostream>/*静态成员函数只能访问静态数据成员、静态成员函数和类以外的函数和数据,不能访问非静态数据成员,但静态成员函数或静态数据成员可由任意访问许可的函数访问。原因是:当前对象的地址(this)是被隐含地传递到被调用的函数的。但一个静态成员函数没有this指针,所以它无法访问非静态的成员函数。*/class a{public: ...原创 2013-08-26 23:23:46 · 2202 阅读 · 0 评论 -
[C++基础]那些容易被混淆的概念:函数/数组指针-指针函数/数组,类/函数模板-模板类/函数
函数指针-指针函数函数指针:指向函数地址的指针变量。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。函数指针可以像一般函数一样,用于调用函数、传递参数。void Func(char *s);// 函数原型void (*pFunc)(char *);//函数指针,pFunc是指向函数的指针可以看出,函数的定义和函数指针的定义非常类似。一般的化,为了简化函数指针类...原创 2013-08-14 11:51:22 · 1362 阅读 · 0 评论 -
[C++基础]友元函数
通常对于普通函数来说,要访问类的保护成员是不可能的,如果想这么做那么必须把类的成员都要改成为public(共用的),然而这做带来的问题遍是任何外部函数都可以毫无约束的访问它操作它,c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作,避免把类成员全部设置成public,最大限度的保护数据成员的安全。友元能够使得普通函数直接访问类的保护数据,避免了类成员函数的频繁调用,可以...原创 2013-08-14 01:21:03 · 1523 阅读 · 0 评论 -
C++开发那些dll和lib
lib是编译时需要的,dll时运行时需要的。如果要完成源代码的编译,有lib就够了。如果也是动态连接的程序运行起来,有dll就够了。 一般的动态库程序有lib文件和dll文件。lib文件时必须在编译器就连接到应用程序中的,而dll文件时运行期才会被调用的。 如果有dll文件,那么对于的lib文件一般是一些索引信息,具体的实现在dll文件中。 如果只有原创 2012-11-05 12:40:37 · 1106 阅读 · 0 评论