随笔分类 - C/C++
摘要:1、导出C函数以用于C或C++的项目如果使用C语言编写的DLL,希望从中导出函数给C或C++的模块访问,则应使用 __cplusplus 预处理器宏确定正在编译的语言。如果是从C++语言模块使用,则用C链接声明这些函数。如果使用此技术并为DLL提供头文件,则这些函数可以原封不动地由C和C++模块使用。以下代码演示可由 C 和 C++ 客户端应用程序使用的头文件:// MyCFuncs.h#ifdef __cplusplusextern "C" { // only need to export C interface if // used by C++ source ...
阅读全文
摘要:在Java 中定义了关键字final,被final修饰的类不能被继承。首先想到的是在C++中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,只要把它的构造函数和析构函数都定义为私有函数。那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数、析构函数而导致编译错误。可是这个类的构造函数和析构函数都是私有函数了,怎样才能得到该类的实例呢?可以通过定义静态来创建和释放类的实例。基于这个思路,可以写出如下的代码:////////////////////////////////////////////////////////////
阅读全文
摘要:#.string 建议 使用string 的方便性就不用再说了,这里要重点强调的是string的安全性。 string并不是万能的,如果你在一个大工程中需要频繁处理字符串,而且有可能是多线程,那么你一定要慎重(当然,在多线程下你使用任何STL容器都要慎重)。 string的实现和效率并不一定是你...
阅读全文
摘要:Q:关于结构体的对齐,到底遵循什么原则?A:首先先不讨论结构体按多少字节对齐,先看看只以1字节对齐的情况:#include <stdio.h>#include <string.h>#define PRINT_D(intValue) printf(#intValue" is %d\n", (intValue));#define OFFSET(struct,member) ((char *)&((struct *)0)->member - (char *)0)#pragma pack(1)typedef struct{ char sex;
阅读全文
摘要:Q:printf和scanf的返回值是什么?int main() { int i = 43; int n = printf("%d\n",i); printf("%d\n",n); return 0;} A:printf函数返回3,因为其输出了'4', '3', '\n' 三个字符。printf返回的是成功输出到STDOUT的字符数。如果发生错误,返回一个负数。scanf返回的是成功赋值的变量个数,如果发生错误,返回EOFQ:既然fgetc是接收输入的字符,返回值用char或者unsigned char不就
阅读全文
摘要:#include <iostream>using namespace std;class A{public: A() { print(); } void fun() { print(); } virtual void print() { cout<<"A::print()"<<endl; } int m;};class B: public A{public: virtual void print() { cout<<"B::print()"<<endl; }}i...
阅读全文
摘要:一、构造和析构函数C++在幕后为你写的的函数:一个拷贝构造函数,一个赋值运算符,一个析构函数,一对取址运算符。另外,如果你没有声明任何构造函数,它也将为你声明一个缺省构造函数。所有这些函数都是公有的。换句话说,如果你这么写:class Empty{};和你这么写是一样的:class Empty {public: Empty(); // 缺省构造函数 Empty(const Empty& rhs); // 拷贝构造函数 ~Empty(); // 析构函数 Empty &...
阅读全文
摘要:1、构造函数和析构函数为什么没有返回值?构造函数和析构函数是两个非常特殊的函数:它们没有返回值。这与返回值为void的函数显然不同,后者虽然也不返回任何值,但还可以让它做点别的事情,而构造函数和析构函数则不允许。在程序中创建和消除一个对象的行为非常特殊,就像出生和死亡,而且总是由编译器来调用这些函数以确保它们被执行。如果它们有返回值,要么编译器必须知道如何处理返回值,要么就只能由客户程序员自己来显式的调用构造函数与析构函数,这样一来,安全性就被人破坏了。另外,析构函数不带任何参数,因为析构不需任何选项。如果允许构造函数有返回值,在某此情况下,会引起歧义。如下两个例子class C{public
阅读全文
摘要:一、大端和小端的问题对于整型、长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节);而 Little endian 则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放据的低位字节到高位字节)。例如,假设从内存地址 0x0000 开始有以下数据: 0x0000 0x00010x00020x0003 0x12 0x34 0xab 0xcd 如果我们去读取一个地址为 0x0000 的四个字节变量,若字节序为big-endian,则读出结果为0x1234abcd;若字节序为little-endian,则读出结果为
阅读全文
摘要:C语言字符串库函数的实现也是笔试题常考的题目,以下代码没有严格测试,只是简单的实现://字符串长度int strlen(const char *str) { assert(str != NULL); int len = 0; while (*str ++ != '\0') ++ len; return len; }//字符串拷贝char *strcpy(char *to, const char *from){ assert((to != NULL) && (from != NULL)); char * re...
阅读全文
摘要:一个空类class A{};的大小为什么是1,因为如果不是1,当定义这个类的对象数组时候A objects[5]; objects[0]和objects[1]就在同一个地址处,就无法区分。单继承#include<iostream>using namespace std;class A{public: virtual void aa(){}private: char k[3];};class B: public A{public: virtual void bb(){}};int main(){ cout<<"A's size is "<
阅读全文
摘要:虚拟构造函数当你有一个指针或引用,但是不知道其指向对象的真实类型是什么时,你可以调用虚拟函数来完成特定类型(type-specific)对象的行为。仅当你还没拥有一个对象但是你确切地知道想要对象的类型时,你才会调用构造函数。那么虚拟构造函数又从何谈起呢?例如假设你编写一个程序,用来进行新闻报道的工作,一条新闻报道由文字或图片组成。你可以这样管理它们:class NLComponent { //用于 newsletter components 的抽象基类public: ... //包含至少一个纯虚函数}; class TextBlock: public NLComponent {publi...
阅读全文
摘要:为什么有必要写自己的operator new和operator delete?答案通常是:为了效率。缺省版本的operator new是一种通用型的内存分配器,它必须可以分配任意大小的内存块。同样,operator delete也要可以释放任意大小的内存块。operator delete想弄清它要释放的内存有多大,就必须知道当初operator new分配的内存有多大。有一种常用的方法可以让operator new来告诉operator delete当初分配的内存大小是多少,就是在它所返回的内存里预先附带一些额外信息,用来指明被分配的内存块的大小。缺省的operator new和operato
阅读全文
摘要:C++中的new/delete与operator new/operator deletenew operator/delete operator就是new和delete操作符,而operator new/operator delete是函数。new operator(1)调用operator new分配足够的空间,并调用相关对象的构造函数(2)不可以被重载operator new(1)只分配所要求的空间,不调用相关对象的构造函数。当无法满足所要求分配的空间时,则 ->如果有new_handler,则调用new_handler,否则 ->如果没要求不抛出异常(以nothrow参数表达
阅读全文
摘要:C++的重载(overload)与重写(override)成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual关键字可有可无。重写是指派生类函数重写基类函数,是C++的多态的表现,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual关键字。示例中,函数Base::f(int)与Base::f(float)相互重载,而Base::g(void)被Derived::g(void)重写。#include using namespace std;class Base{publ
阅读全文
摘要:先看代码: 1 #include <iostream> 2 using namespace std; 3 4 class A {}; 5 6 class B 7 { 8 public: 9 B(){}10 B(A& a){}11 };12 13 class B1: public B14 {15 public:16 B1(const B& b) : B(b)17 {}18 };19 20 int main()21 {22 A a;23 B b(a);24 B1 b1(a);25 return 0;26 ...
阅读全文
摘要:一道C++笔试题:设计一个只能在堆内存上实例化的类和一个只能在栈内存上实例化的类只能在堆内存上实例化的类:将析构函数定义为private,在栈上不能自动调用析构函数,只能手动调用。也可以将构造函数定义为private,但这样需要手动写一个函数实现对象的构造。只能在栈内存上实例化的类:将函数operator new和operator delete定义为private,这样使用new操作符创建对象时候,无法调用operator new,delete销毁对象也无法调用operator delete。#include <iostream>using namespace std;//只能在堆
阅读全文
摘要:1、字符串数字之间的转换(1)string --> char * string str("OK"); char * p = str.c_str();(2)char * -->string char *p = "OK"; string str(p);(3)char * -->CString char *p ="OK"; CString m_Str(p); //或者 CString m_Str; m_Str.Format("%s",p);(4)CString --> char * CString
阅读全文
摘要:开博第一篇,hello world!#include <iostream>using namespace std;class say{public: say() { cout << "Hello "; } ~say() { cout << "world!"; }}hello;int main(){ return 0;}使用过下面两个博客,开学找工作,把以前学的一些东西,重新整理一下发布在这里。http://hi.baidu.com/new/xun1573http://blog.csdn.net/luxiaoxun
阅读全文