标签: C++


1. 类的初始化

  几种不同初始化的区别:

  A a;A *a=new A()的区别,示例程序如下:

#include <stdio.h>
#include <string>
#include <string.h>
#include <iostream>
using namespace std;
class A{
public:
A(string name){
cout<<"a instance of A : "<<name<<endl;
this->name=name;
}
~A(){
cout<<"destory instance of A : "<<this->name <<endl;
}
void print(){
cout<<this->name<<" is printing..."<<endl;
}
private:
string name;
};
int main(){
A a1("gqx");
A* a2 = new A("test");
a1.print();
a2->print();
return 0;
}

  执行结果如下,通过A a1("gqx")形式初始化的对象,在程序结束的时候会自动回收内存,调用析构函数,而通过new方式初始化的对象需要手动释放内存。

a instance of A : gqx
a instance of A : test
gqx is printing...
test is printing...
destory instance of A : gqx
按 <RETURN> 来关闭窗口...

  修改主程序如下后:

int main(){
A a1("gqx");
A* a2 = new A("test");
a1.print();
a2->print();
delete a2;
return 0;
}

  执行结果如下:

a instance of A : gqx
a instance of A : test
gqx is printing...
test is printing...
destory instance of A : test
destory instance of A : gqx
按 <RETURN> 来关闭窗口...

  由此可知:

A a1("gqx"); 实例化对象在栈内存,出了作用域自动释放空间。(当然如果是全局变量,存在全局区,程序结束后由系统自动释放。)

A* a2 = new A("test");实例化对象在堆内存,需要手动释放内存空间

  而A* a=new AA* a=new A()的区别则是:

A* a=new A 分配一块内存空间,并将其地址传给指针a

A* a=new A() 分配一块内存空间,并将其地址传给指针a。且后面的()表示的意思是用()中的内容对指针*a中的内容进行初始化,此处默认是空字符串。

2. memset函数

  memset函数是内存赋值函数,用来给某一块内存空间进行赋值的,将每个字节初始化为同一值,即达到对对象的初始化,一般是对结构体的初始化,比如:

struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));

其原型是:

void* memset(void *_Dst, int  _Val, size_t _Size)
//_Dst是目标起始地址,_Val是要赋的值,_Size是要赋值的字节数。

注意:memset()是逐字节拷贝的。例如int num[8];。我们用memset给num初始化为{1,1,1,1,1,1,1,1},一个int是4个字节的,8个int是32个字节,所以首先要赋值的长度就不应该为8而是32。 因为memset是逐字节拷贝,以num为首地址的8字节空间都被赋值为1, 即一个int变为0X00000001 00000001 00000001 00000001,显然,把这个数化为十进制不会等于1的。

所以,在memset使用时要千万小心,在给char以外的数组赋值时,只能初始化为0或者-1。-1和0的补码各个位都是1和0。

3.字符串拷贝函数

  strcpy的函数原型:

char *strcpy(char* dest, const char *src);

作用:把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间。

这里需要注意的是:dest应该是一片内存的首地址,不能是没有分配内存的指针,且该对象有足够的存储空间用于存储源字符串。

strncpy相对于strcpy函数多了一个表示可拷贝的最大字符数的参数。这样在很大程度上就能避免strcpy函数的不足(程序员在用strncpy时,需要填写拷贝个数,这时程序员就很肯能会检查一下dest是否有足够的内存)。

char *strncpy(char *dest, const char *src, int n);

要注意:n表示可拷贝的最大字符数,如果提前遇到'\0',拷贝的长度会小于n。另外,如果仅拷贝源字符串的一部分,可能会造成目标串没有字符串结束标志'\0';

string类型转化为char*类型 ——C++中,c_str()的用法,就是把 string 转成 char*

string str="yoooo";
char *a=str.c_str();

4.malloc使用的时候为什么要加上强制类型转换

  举例如下,为一个结构体数组申请内存空间的时候,常常会使用如下语句:

ep_events = (struct epoll_event*)malloc(sizeof(struct epoll_event)*EPOLL_SIZE);

经常会在前面添加一个强制类型转换语句,如果不使用,如下:

ep_events = malloc(sizeof(struct epoll_event)*EPOLL_SIZE);

编译器会报错:

epolltest.cpp::: error: invalid conversion from ‘void*’ to ‘epoll_event*’ [-fpermissive]
ep_events = malloc(sizeof(struct epoll_event)*EPOLL_SIZE);

大概的意思是,malloc返回的是一个void*类型指针,编译器在编译的时候无法将其自动转换成struct epoll_event*类型的指针,需要我们手动强制转换。

5. printf

  printf是一个行缓冲函数,先写到缓冲区,满足条件后,才将缓冲区刷到对应文件中,刷缓冲区的条件如下:

  1. 缓冲区填满

  2. 写入的字符中有‘\n’ '\r'

  3. 调用fflush手动刷新缓冲区

  4. 调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新。

做如下实验:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<unistd.h>
using namespace std;

int main(int argc, char *argv[])
{
printf("test");
sleep(10);
return 0;
}

10秒之后才打印test,中途Ctrl+C则不会打印test。如果打印语句换成以下形式:

 printf("test\n");

程序运行时刻打印test。

6. 补充中。。。

C++几个细节(1)的更多相关文章

  1. Vue.js 和 MVVM 小细节

    MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...

  2. vue2.0实践的一些细节

    最近用vue2.0做了个活动.做完了回头发现,好像并没有太多的技术难点,而自己好像又做了比较久...只能说效率有待提升啊...简单总结了一些比较细节的点. 1.对于一些已知肯定会有数据的模块,先用一个 ...

  3. 深入理解JS 执行细节

    javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链等 ...

  4. javaScript中的小细节-script标签中的预解析

    首先介绍预解析,虽然预解析字面意思很好理解,但是却是出坑出的最多的地方,也是bug经常会有的地方,利用好预解析的特性可以解决很多问题,并且提高代码的质量及数量,浏览器在解析代码前会把变量的声明和函数( ...

  5. 分享MSSQL、MySql、Oracle的大数据批量导入方法及编程手法细节

    1:MSSQL SQL语法篇: BULK INSERT [ database_name . [ schema_name ] . | schema_name . ] [ table_name | vie ...

  6. Android ScrollView监听滑动到顶部和底部的两种方式(你可能不知道的细节)

    Android ScrollView监听滑动到顶部和底部,虽然网上很多资料都有说,但是不全,而且有些细节没说清楚 使用场景: 1. 做一些复杂动画的时候,需要动态判断当前的ScrollView是否滚动 ...

  7. [更新设计]跨平台物联网通讯框架ServerSuperIO 2.0 ,功能、BUG、细节说明,以及升级思考过程!

    注:ServerSuperIO 2.0 还没有提交到开源社区,在内部测试!!! 1. ServerSuperIO(SSIO)说明 SSIO是基于早期工业现场300波特率通讯传输应用场景发展.演化而来. ...

  8. Oracle Sales Cloud:管理沙盒(定制化)小细节2——使用对象触发器更新数字字段

    在上一篇 "管理沙盒(定制化)小细节1" 的随笔中,我们使用公式法在 "业务机会" 对象(单头)上建立了 "利润合计" 字段,并将它等于 & ...

  9. Oracle Sales Cloud:管理沙盒(定制化)小细节1——利用公式创建字段并显示在前端页面

    Oracle Sales Cloud(Oracle 销售云)是一套基于Oracle云端的CRM管理系统.由于 Oracle 销售云是基于 Oracle 云环境的,它与传统的管理系统相比,显著特点之一便 ...

  10. Oracle Sales Cloud:报告和分析(BIEE)小细节2——利用变量和过滤器传参(例如,根据提示展示不同部门的数据)

    在上一篇随笔中,我们建立了部门和子部门的双提示,并将部门和子部门做了关联.那么,本篇随笔我们重点介绍利用建好的双提示进行传参. 在操作之前,我们来看一个报告和分析的具体需求: [1] 两个有关联的提示 ...

随机推荐

  1. 利用.net Core 对程序集中的类 进行统一依赖注入

    1.创建特性 用于标注依赖注入 using Microsoft.Extensions.DependencyInjection; using System; using System.Collectio ...

  2. 1-5设定NetCore监听端口

    问题的起源:启动一个.netCore项目,默认使用的是5000端口,当我们有很多个项目的时候(集群),不可能都使用5000端口. 方法1:set ASPNETCORE_URLS=http://127. ...

  3. 还在使用vc6.0吗??vs2010吧

    每个人在面对新的事物的时候,总是充满了排斥感,当vista和win7来临的时候,我们还在留恋xp,说xp是如何的好,win7是如何的不给力,当然,我们必须承认,xp是一款优秀的操作系统,这个我们无法否 ...

  4. Python 函数调用性能记录

    之前用 JS 写项目的时候,项目组用的组件模式,一直感觉很不错.最近用 Python 做新项目,项目结构也延续了组件模式.一直没有对函数调用的性能作了解,今天突发奇想测试了一下,写了一些测试代码 首先 ...

  5. 基于高德地图的描点操作,监听地图缩放,展示合理数量的marker

    原文:基于高德地图的描点操作,监听地图缩放,展示合理数量的marker 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lx583274568/art ...

  6. C# ?和??使用讲解

    原文:C# ?和??使用讲解 场景1:使用?定义可空类型 众所周知,C#中的值类型是不可以为null的,如果必须为null,则需要将变量定义为可空类型,如下所示: int? age = null; 场 ...

  7. BigTable介绍PPT

  8. Coder-Strike 2014 - Finals (online edition, Div. 1)

    CF 420A  A. Start Up 题目链接: http://codeforces.com/problemset/problem/420/A 题目意思: 给一个字符串A,通过镜面反射后得到A', ...

  9. 测试WPF绑定bug

    1.低级错误:有没有绑错2.去属性那里打断点,get.set有没有进3.xaml加上twoway,UpdateSourceTrigger=PropertyChanged

  10. WPF 4 日期选择器(DatePicker)

    原文:WPF 4 日期选择器(DatePicker)      前一篇<WPF 4 日历控件(Calendar)> 中我们对日历控件的使用方式有了基本了解,本篇将继续介绍WPF 4 中另一 ...