C/C++语法
知之可否
这个作者很懒,什么都没留下…
展开
-
C++里面的const是怎么实现的?
Const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。现在它的形式变成了:Const DataType VariableName = VariableValue ;为什么const能很好地取代预定义语句?const 到底有什么大神通,使它可以振臂一挥取代预定义语句呢?1. 首先,以const 修饰的常量值,具有不可变性,这是它能取代预定义语句的转载 2016-08-29 21:32:53 · 798 阅读 · 0 评论 -
一个进程在内存中的布局
值得一提的是:在C#中struct存放在栈区,class存放在堆区,所以一般struct要比class要快的。 堆和栈的比较表(仅针对C++) 栈(Stack)堆(Heap)申请方式由OS自动分配。例如在函数声明一个局部变量int b; OS自动在栈中为b开辟空间需要程序员自己申转载 2016-03-29 10:00:52 · 2917 阅读 · 0 评论 -
const、static变量存放位置
我们将以下面的例子介绍const变量和static变量的存放位置:static int val_a = 1 ; // 初始化的静态变量 int val_b = 2 ; // 全局变量 const int val_c = 3 ; // const 全局变量 static int val_d ; // 未初始化的静态变量 int val_e ; /转载 2016-03-29 09:58:05 · 20116 阅读 · 3 评论 -
const指针与指向const对象的指针
1.const指针是一种指针,此指针指向的地址是不能够改变的,但是其指向的对象是可以被修改的,其定义类似: int* const p=地址; 比如下面的代码:int b=12; int* const a=&b; void tes() { *a=1; } 此代码是正确的,先声明了变量b,然后声明一个const指针a,此指针指向变量b,在tes函数中修改转载 2016-03-28 15:10:41 · 497 阅读 · 0 评论 -
const的用法,特别是用在函数前面与后面的区别!
const的用法,特别是用在函数后面在普通的非 const成员函数中,this的类型是一个指向类类型的 const指针。可以改变this所指向的值,但不能改变 this所保存的地址。 在 const成员函数中,this的类型是一个指向 const类类型对象的 const指针。既不能改变 this所指向的对象,也不能改变 this所保存的地址。关键字:Const,Const函数,Const变量,函数转载 2016-03-28 15:08:15 · 8183 阅读 · 2 评论 -
c++ 函数返回引用
c++ primer p215一,c++函数的返回分为以下几种情况1)主函数main的返回值:这里提及一点,返回0表示程序运行成功。2)返回非引用类型:函数的返回值用于初始化在跳用函数出创建的临时对象。用函数返回值初始化临时对象与用实参初始化形参的方法是一样 的。如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。且其返回值既可以是局部对象,也可以是求解表达式的结果。3)返回引用:当转载 2016-03-28 10:22:27 · 1078 阅读 · 0 评论 -
显式构造函数
1.什么是显式构造函数?首先要理解什么是隐式构造函数,并且弄清它的优缺点。#include <iostream>using std::cout;using std::endl;class complexNumbers { double real, img;public: complexNumbers() : real(0), img(0) { } complexNumbers(co转载 2016-03-28 09:36:43 · 1555 阅读 · 0 评论 -
C语言中全局变量、局部变量、静态全局变量、静态局部变量的区别
1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。从作用域看:1>全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。2>静态局部变量具有局部作用域转载 2016-04-13 10:20:54 · 690 阅读 · 0 评论 -
百度笔试题:malloc/free与new/delete的区别
相同点:都可用于申请动态内存和释放内存不同点:(1)操作对象有所不同。malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内转载 2016-04-12 10:20:55 · 1090 阅读 · 0 评论 -
指针到底能不能修改其指向的常量字符串?
1.指针到底能不能修改其指向的常量字符串?今天做一个字符串右移函数时,直接使用指针来修改字符串常量的值出现了奇怪运行时错误。 代码如下:#include"stdio.h"#include"string.h"void LoopMove(char*pStr,int steps) { char temp ,temp_ch ; //char*cp=pStr ; int i ,转载 2016-04-07 22:45:06 · 4837 阅读 · 1 评论 -
c++中union的使用,看高手们如何解释的
大部分转自http://www.cnblogs.com/xdotnet/archive/2011/04/20/cpp_union.htmlunion主要是共享内存,分配内存以其最大的结构或对象为大小,即sizeof最大的。在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物只取其一时(我们姑且通俗地称其为“n 选1”),我们也转载 2016-04-07 22:12:45 · 8020 阅读 · 0 评论 -
x&(x-1)的含义
求下面函数的返回值(微软) ———统计1的个数int func(int x){int countx = 0;while(x){countx++;x = x&(x-1);}return countx;} 假定x = 9999 10011100001111 答案: 8 思路: 将x转化为2进制,看含有的1的个数。 注: 每执行一次x = x&(x-1),会将x用二进制表示时最右转载 2016-04-10 20:46:39 · 2507 阅读 · 0 评论 -
解析char *p与char p[]
见论坛上有人讨论这个问题,感觉也是涉及面比较广,而且很多人犯过这个错误,比如声明char *p = "hello world!";却妄图用p指针改变字符串内容,所以就这个问题,我总结了一下。转载注明作者Logic0以及出处。主要解析的问题:问题1:#include "stdio.h"char *get_string_1(){ char p[] = "hello转载 2016-05-24 09:39:10 · 5078 阅读 · 4 评论 -
c++ 中的fill 和memset
fill 的头文件是 命名空间是std; 用法: eg: #include using namespace std; int main() { char s[100]; fill(s,s+100,'a'); for(int i=0;i cout cout转载 2016-07-29 15:05:34 · 1666 阅读 · 0 评论 -
内存对齐及#pragma pack的使用
在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储(成员之间可能有插入的空字节),第一个成员的地址和整个结构的地址相同。 C编译器缺省的结构成员自然对界条件为“N字节对齐”,N即该成员数据类型的长度。如int型成员的自然对界条件为转载 2016-05-23 11:16:10 · 712 阅读 · 0 评论 -
指针数组和数组指针的区别
这两个名字不同当然所代表的意思也就不同。我刚开始看到这就吓到了,主要是中文太博大精深了,整这样的简称太专业了,把人都绕晕了。从英文解释或中文全称看就比较容易理解。指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针数组指针:a pointer to an array,即指向数组的指针还要注意的是他们用法的区别,下面举例说明。in转载 2016-05-20 20:08:12 · 371 阅读 · 0 评论 -
Overload、Override和隐藏的区别
Overload:顾名思义,就是Over(重新)——load(加载),所以中文名称是重载。它可以表现类的多态性,可以是函数里面可以有相同的函数名但是参数名、返回值、类型不能相同;或者说可以改变参数、类型、返回值但是函数名字依然不变。Override:就是ride(重写)的意思,在子类继承父类的时候子类中可以定义某方法与其父类有相同的名称和参数,当子类在调用这一函数时自动调用子类的方法,而父转载 2016-05-09 10:34:03 · 1496 阅读 · 0 评论 -
C++输出流cout的执行顺序问题
首先看一个例子:int fun1(){ cout return 1;}int fun2(){ cout return 2;}int main(){ cout " return 0;} 输出结果是num2num11 2为什么呢?为什么不是num11num22呢?这里涉及到cout转载 2016-05-06 15:30:32 · 4290 阅读 · 2 评论 -
string 与char*,const char*, char[]之间的转换
1、string首先必须了解,string可以被看成是以字符为元素的一种容器。字符构成序列(字符串)。有时候在字符序列中进行遍历,标准的string类提供了STL容器接口。具有一些成员函数比如begin()、end(),迭代器可以根据他们进行定位。注意,与char*不同的是,string不一定以NULL('\0')结束(一般是'\0'结束)。string长度可以根据length()得到转载 2016-05-05 11:15:33 · 5174 阅读 · 0 评论 -
C++ 初始化列表
何谓初始化列表与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。在C++中,struct和class的唯一区别是默认的访问性不同,而这里我们不考虑访问性的问题,所以下面的代码都以struct来演示。struct foo{ string name ; int id ; foo(s转载 2016-05-04 16:12:07 · 323 阅读 · 0 评论 -
C++中虚函数工作原理和(虚)继承类的内存占用大小计算
原文地址:http://blog.csdn.net/hackbuteer1/article/details/7883531一、虚函数的工作原理 虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数。典型情况下,这一信息具有一种被称为 vptr(virtual table pointer,虚函数表指针)的指针的形式。vptr 指向一个被称为 vtb转载 2016-05-03 17:58:32 · 484 阅读 · 0 评论 -
关于C++中的虚拟继承的一些总结
1.为什么要引入虚拟继承虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下:class Aclass B1:public virtual A;class B2:p转载 2016-05-03 11:55:12 · 320 阅读 · 0 评论 -
sprintf、snprintf
1.sprintfhttp://www.cplusplus.com/reference/cstdio/sprintf/int sprintf ( char * str, const char * format, … );2.snprintfhttp://www.cplusplus.com/reference/cstdio/snprintf/int snprintf ( char * s, size_原创 2016-05-26 11:11:48 · 420 阅读 · 0 评论 -
C++虚函数与虚函数表
多态性可分为两类:静态多态和动态多态。函数重载和运算符重载实现的多态属于静态多态,动态多态性是通过虚函数实现的。每个含有虚函数的类有一张虚函数表(vtbl),表中每一项是一个虚函数的地址, 也就是说,虚函数表的每一项是一个虚函数的指针。没有虚函数的C++类,是不会有虚函数表的。虚函数表的指针4个字节大小(vptr),存在于对象实例中最前面的位置(这是为了保证取到虚函数表的有最高的性能——如果有多层继转载 2016-04-07 19:43:54 · 357 阅读 · 0 评论 -
C++依次读取文件中的字符串——getline()函数的应用
getlime()有着两种形式http://www.cplusplus.com/reference/string/string/getline/ (1) istream& getline (istream& is, string& str, char delim); (2) istream& getline (istream& is, string& str);其中 getline(i原创 2016-03-23 22:22:21 · 8073 阅读 · 0 评论 -
C++中引用不能重新赋值的理解
教材上说引用是不能重新赋值的,可是下面的程序能正常运行,不会出错。这里怎么出现了引用赋值语句呢(语句[1])?是不是教材错了?原因究竟是什么呢? 请看如下程序: #include<iostream.h>void main(){ int i=1,j=5; int& k=i; k=j; //语句[1] cout<<"i="<<i转载 2016-04-06 11:35:54 · 12952 阅读 · 5 评论 -
元素的引用
此时引用&不同于取地址符号#include <iostream>#include <vector>using namespace std;int fun(int& x){x++;return x;} int main(void){int b =10;int& a=b;fun(a);cout << b <<endl;return 0;}此时b输出的是多少呢?答案是11a也是11原创 2015-08-28 22:54:09 · 699 阅读 · 0 评论 -
C语言中extern的用法
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。 1. extern修饰变量的声明。 举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引用变量v。能够被其他模块以extern修饰符引用到的变量通常是全局变量。还有很重要的一点是,extern int v可以放在a.c转载 2015-08-27 21:38:27 · 79445 阅读 · 2 评论 -
C++构造函数初始化列表
1.初始化成员变量构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:class CExample {public: int a; float b; //构造函数初始化列表 CExample(): a(0),b(8.8) {} //构造函数内部赋值 CExample()原创 2015-05-13 10:29:01 · 631 阅读 · 0 评论 -
C++类中调用与成员函数同名的全局函数
c++ 类中的方法调用本类的与全局函数同名的方法 如一个类A中有成员函数test1()与test2(),而全局函数中有一个名字也为test1(),这时候若在A的test2()成员函数中调用test1()函数,调用的会是哪个? 看例子: void test1() {cout<<”i am outer test1”;} class A{ void test1() {cout<<”i am转载 2015-05-12 11:23:47 · 5523 阅读 · 0 评论 -
A *a=new B();
#include<iostream>using namespace std;class A{ public: ~A(){ cout<<111<<endl; }};class B:public A{ public: ~B(){ cout<<222<<endl; }};原创 2015-05-12 17:00:12 · 4603 阅读 · 1 评论 -
C++使用虚函数的时候,子类也要使用virtual关键字吗
父类使用虚函数是为了让子类重写,那子类重写的时候也需要带virtual关键字吗?比如: class Base{ virtual bool init(); }; class Derived{ virtual bool init(); //这里的vitual是必须的吗?好像不用也能编译通过呃….. };c++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为转载 2015-05-12 15:57:07 · 22340 阅读 · 2 评论 -
getline(cin,str)无法从终端获数据的问题
http://blog.csdn.net/zzyafyj/article/details/38524417原创 2015-04-17 21:18:59 · 685 阅读 · 0 评论 -
字符串分割(C++)
1.C风格字符串分割原型: char *strtok(char *str, const char *delim); 功能:分解字符串为一组字符串。 参数说明:str为要分解的字符串,delim为分隔符字符串。 返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。 其它:strtok函数线程不安全,可以使用strtok_r替代。 示例://借助strtok实现spl原创 2015-03-30 22:14:27 · 747 阅读 · 0 评论 -
typedef int int_array[4]
这个出现在C++prime第四版第124页,刚看没理解#include<iostream>using namespace std;int main(){ int ia[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}; typedef int int_array[4]; for(int_array *p=ia;p!=ia+3;++p)原创 2015-03-29 21:37:49 · 2594 阅读 · 0 评论 -
long long,long,int
突然间就想到了long和int到底什么区别(发现有很多问题都是突然间想到的),然后百度、google各种查找,各种书籍:《C++ Primer》、《C程序设计语言》查看,终于明白了一些。下面的话选自《C程序设计语言》: short与long两个限定符的引入可以为我们提供满足实际需要的不同长度的整形数。int通常代表特定机器中证书的自然长度。short类型通常为16位,long类型通常为32位,in转载 2015-03-07 11:25:25 · 3380 阅读 · 0 评论 -
C++函数返回引用
首先需要明白:C++函数为什么要返回引用?答:这样就不用返回结果的副本。因为返回副本需要做赋值拷贝函数,浪费时间。这时候,实际上,返回是结果的副本,而不是结果本身。如果要返回本身,就返回引用就OK了。例1:[cpp] view plaincopyconst string manip2(const string& s){转载 2015-01-31 10:55:32 · 971 阅读 · 0 评论 -
stringstream
stringstream是字符串流。它将流与存储在内存中的string对象绑定起来。在多种数据类型之间实现自动格式化1 stringstream对象的使用#include<sstream>#include<iostream>using namespace std;int main(){ string line,word; while(getline(cin,l转载 2015-08-30 22:38:33 · 1199 阅读 · 0 评论 -
sscanf()--字符串格式化输入
sscanf() 的作用:从一个字符串中读进与指定格式相符的数据. 原型: int sscanf (const char str,const char format,……..); 说明: sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。转换后的结果存于对应的参数内。 成功则返回参数数目,失败则返回0。 注意:sscanf与scanf类似转载 2015-09-06 21:56:51 · 3966 阅读 · 0 评论 -
C++ unique函数
类属性算法unique的作用是从输入序列中“删除”所有相邻的重复元素。该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度没变,只是元素顺序改变了),表示无重复的值范围得结束。// sort words alphabetically so we can find the duplicates sort(words.begin(), words.end());转载 2016-03-29 15:07:36 · 1254 阅读 · 0 评论