自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 /r与/n以及 /r/n 的区别

\r就是"回到行首",\n就是"到下一行"即:\r是回车,\n是换行,前者使光标到行首,后者使光标下移一格。通常用的Enter是两个加起来的,即\r\n#include using namespace std;int main(){ cout<<"vsdvas"<<"\n"; cout<<"vsdvas\r"<<"adc\n";return 0;}结

2016-11-03 17:17:41 891

原创 在c++中“\n”与endl之间的区别

endl是一个模板函数,输出一个换行符,并立即刷新缓冲区。而“\n”就仅仅只是一个换行换行而不清除缓冲区:cout 清除缓冲区而不换行:cout 即换行而又清除缓冲区:cout cout 所以 endl == \n + flush

2016-11-03 14:01:02 751

原创 C++中cout,cerr,clog的区别

c++标准库定义了4个IO对象,cin,cout,cerr,clog .cin 为标准输入,cout,cerr,clog都是输出流对象,三者有什么区别呢?cout 与cerr的主要区别是cout的输出信息可以被重定向到文件中,而cerr则只能输出到标准输出(显示器)上。 int main() { cout << "hello w

2016-11-03 11:14:12 747

原创 C++类成员变量初始化顺序问题

#include #include #include class A { private: int n1; int n2; public: A():n1(n2+2),n2(0){} void Print(){ cout << "n1:" << n1 << ", n2: " << n2 <<en

2016-11-02 10:18:33 552

原创 函数声明后面的const用法

在类成员函数的声明和定义中,const的函数不能对其数据成员进行修改操作。const的对象,不能引用非const的成员函数。#include #include #include class A{ private: int m_a; public: A() : m_a(0) {} int getA()

2016-10-31 10:12:56 445

原创 类A 中没有生命任何成员变量与成员函数,sizeof(A)的值是1

当一个类A 中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少,如果不是零,请解释一下编译器为什么没有让它为零。肯定不是零。举个反例,如果是零的话,声明一个class A[10]对象数组,而每一个对象占用的空间是零,这时就没办法区分A[0],A[1]…了。#include #include class USER{};int main(int argc,

2016-10-26 10:29:10 1260

原创 inline函数(内联函数)使用

比如 int g(int x) { return x + x; } int f() { return g(); } 这样f会调用g,然后g返回x + x给f,然后f继续把那个值返回给调用者。 如果g是inline的话。f会被直接编译成。 int f() { return x + x; } 相当于把g执行的操作直接融合到f里。这样减少了调用g消耗的时间,但同时也

2016-10-26 10:01:25 559

原创 用到placement new这个叫做定位new,用这个new是不分配内存

#include #include #include //#include struct CLS{ int m_i; CLS( int i ):m_i(i) {} CLS() { new (this) CLS(0);//如果用到placement new这个叫做定位new,用这个new是不分配内存的 } ~CLS() { printf("destory!\n");

2016-10-25 16:02:43 319

原创 c++中用malloc分配与用new分配以及构造函数与构造函数的执行

#include #include #include class USER{public: USER() { printf("construct user\n"); } ~USER() { printf("destory user\n"); } int i;};int main(int argc, char* argv[]){ //用malloc分配,

2016-10-25 14:27:42 5044

原创 fscanf与fprintf的使用

#include #include #include void main(void){ FILE *fp; char str[100]; int a[3]; int i=0,i1,i2,i3,i4,i5,i6; fp=fopen("a.txt","r"); if (fp==NULL) { printf("can not open file\n"); return; }

2016-10-25 10:05:46 521

原创 数组的4种形式输出

数组内存的首地址和数组第0个元素的地址什么区别?它们的地址值是相等的;第0个元素的地址如果是p,则p+1就是第1个元素的地址;数组的首地址如果是p,则p+1就跳过这个数数组而指向这个数组最后一个元素最后一个字节的下一字节。#include #include #include main(){ int j=0, k,k1,* k3,i; int ch[][4]={{1

2016-10-21 15:50:30 6427

转载 数组指针和指针数组的区别

数组指针和指针数组的区别数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4

2016-10-19 15:03:07 314

原创 函数指针的正常使用,函数指针作为函数参数使用,函数指针作为函数参数使用

函数指针的正常使用//1 函数指针的正常使用void test1(){ printf("world\n");}void main(){ test1();//call 函数,其实本质就是通过test1这个函数的起始地址进入test1函数里面的代码 //执行这些代码,但是因为test1这个函数的代码本身就存储在代码区的一个内存块, //所以可以用指针进行指向 //那么指针的概念

2016-10-18 13:51:38 426

原创 函数指针与指针函数的区别

1、函数指针首先它是一个指针,只是这个指针指向的是一个函数。指针变量可以指向变量的地址、数组、字符串、动态分配地址,同时也可指向一个函数,每个函数在编译的时候,系统会分配给该函数一个入口地址,函数名表示这个入口地址,那么指向函数的指针变量称为函数指针变量。 指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。    例如:

2016-10-18 12:33:25 282

原创 内联函数与宏定义的区别

一、宏定义和内联函数的区别1. 宏定义不是函数,但是使用起来像函数。预处理器用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率。    内联函数本质上是一个函数,内联函数一般用于函数体的代码比较简单的函数,不能包含复杂的控制语句,while、switch,并且内联函数本身不能直接调用自身。如果内联函数的函数体过大,编译器会自动的把这个内联函数变

2016-10-17 15:30:23 864

原创 宏定义下要注意,不然会出错

#include#define MAX(a,b) (a)>(b)?(a):(b)int main(){int a=4,b=2,ret;ret=MAX(a,b)+3;printf("=%d,b=%d,ret=%d\n",a,b,ret);//由于运算符‘+’比运算符‘:’的优先级高,所以上述语句并不等价于期望的 return 0;}结果为;如果正确想要得的结果则修改

2016-10-17 14:24:52 722

原创 c宏定义

#include#define MAX(a,b) ((a)>(b)?(a):(b))int main(){int a=1,b=0,ret;MAX(a++,b);printf("MAX(a++,b):a=%d,b=%d\n",a,b);MAX(a++,b+10);printf("MAX(a++,b+10):a=%d,b=%d\n",a,b);MAX(a++,b);pr

2016-10-17 12:16:25 374

原创 extern “C”的使用

用c++来调用c函数的时候,因为c++的函数是函数名+参数编译的结果,在c语言中函数就直接编译成函数,所以要加extern “C”的声明表示调用的函数是依据c编译的规则

2016-10-14 17:00:31 289

原创 参数个数可变函数

在c中,可以这样编写参数个数可变函数#includevoid test(int i, ...){char *p1=(char *)*(&i+1);char *p2=(char *)*(&i+2);printf("p1=%s,p2=%s\n",p1,p2);}int main(){int i=3;test(1,"dewfwrfew","gewagae");retur

2016-10-14 16:56:55 400

原创 指针和字符的初始化

#include int main(){int *p1=NULL;int *p2='\0';//转义字符\,所以结果为0int *p3="\0";//如果写双引号就是字符串了,就是0int *p4={0};char a="\0";//不是字符串。表示2个0,以0结尾char b="0";//表示字符串,0所对应的ascii码表的30,以0结尾char c={0};//这个才表示

2016-09-18 23:10:00 442

原创 字符串比较

#include int main(){char str1[] = "abc";char str2[] = "abc";const char str3[] = "abc";const char str4[] = "abc";const char* str5 = "abc";const char* str6 = "abc";printf(" str1==str2 %d\n",

2016-09-17 21:26:00 254

原创 16.7 泛型类

泛型类:泛型类的定义格式;class 类名{}泛型注意事项:1、在类上自定义泛型的具体数据类型是在使用该类的时候创建对象的时候确定的。2、如果一个类在类上已经声明了自定义泛型,如果使用该类创建对象的时候没有指定泛型的具体类型,那么就是默认为Object类型。3、在类上自定义泛型不能作用于静态的方法,如果静态的方法需要使用自定义泛型没那么需要在方式法上自己声明

2016-06-05 13:59:11 445

原创 16.6 方法上自定义泛型

JDK1.5以后才会出现:是为了兼顾新老系统的兼容性问题方法上自定义泛型注意:泛型没有多态的概念,左右2边的类型都是一样,或者是只写一边在泛型中不能使用基本数据类型,如果需要使用基本数据类型,那么就使用基本数据类型对应的包装类型。byte  -- Byteshort -- Shortint -- integerdouble -- Doublelong

2016-06-05 13:55:11 409

原创 16.5 TreeSet的实现原理

TreeSet的实现原理(底层用红黑树,即二叉)TreeSet要注意的事项:1、往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按元素自然顺序的特性进行排序存储。2、往TreeSet添加元素的时候,如果元素本身不具备了自然顺序的特性,那么该元素所属的类必须要实现Comparable接口,把元素的比较规则定义在compareTo(T o )上。3、如果比较元素

2016-06-05 13:53:57 489

原创 16.4 TreeSet

TreeSetTreeSet要注意的事项:1、往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按元素自然顺序的特性进行排序存储。2、往TreeSet添加元素的时候,如果元素本身不具备了自然顺序的特性,那么该元素所属的类必须要实现Comparable接口,把元素的比较规则定义在compareTo(T o )上。import java.util.HashSet;

2016-06-05 13:53:03 319

原创 16.3 HashSet的原理

HashSet的原理-----|Collection 单列集合的根接口---------|List如果实现了List接口的集合类,具备的特点:有序,可重复------------|ArrayList(常用) ArrayList底层是维护了一个Object数组实现的。特点:地址连续,查询速度快,增删慢------------|LikeList------------|Vector

2016-06-05 13:51:45 264

原创 16.2 vector

vector其底层也是维护了一个Object的数组实现的,实现与ArrayList是一样的,但是Vector是线程安全的,操作效率低。ArrayList与Vector的区别:相同点:ArrayList与Vector底层都是使用Object数组实现的。不同点:1、ArrayList是线程不同步的,操作效率高,Vector是线程同步的,操作效率低。2、A

2016-06-05 13:49:54 298

原创 16.1 扑克牌

import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.ListIterator;import java.util.Random;import java.util.Scanner; class Poker { String number; S

2016-06-05 13:49:07 399

原创 15.6 LinkeList的实现原理

ArrayList的原理-----|Collection 单列集合的根接口---------|List如果实现了List接口的集合类,具备的特点:有序,可重复------------|ArrayList(常用) ArrayList底层是维护了一个Object数组实现的。特点:地址连续,查询速度快,增删慢------------|LinkeList------------|Vec

2016-06-05 13:46:37 422

原创 15.5 ArrayList的原理

ArrayList的原理-----|Collection 单列集合的根接口---------|List如果实现了List接口的集合类,具备的特点:有序,可重复------------|ArrayList(常用) ArrayList底层是维护了一个Object数组实现的。特点:地址连续,查询速度快,增删慢------------|LikeList------------|Vect

2016-06-05 13:45:34 270

原创 15.4 迭代器要注意的事项

迭代器的add()加入数据是添加到当前指针指向的位置,则当前的数据往下一位移。集合的add()的加在集合的后面。remove()和add()都会改变个数,  set()可以,它不会改变个数迭代器在遍历元素的时候要注意,在迭代器迭代元素的过程中(迭代器一旦创建到使用结束的时间,就是迭代器带集合对象使用的后面一直不用,就可以),不允许使用集合对象改变集合中的元素,如果需要添加或者删

2016-06-05 13:44:55 313

原创 15.3 List接口特有方法

List接口特有方法(有序)有序:指进出的顺序是一样的只有List接口中特有的方法具备的特点,其他接口下面的集合类都是没有索引值的添加add(int index, E element) addAll(int index, Collection c) 获取get()indexOf(Object o)listIterator() 修改se

2016-06-05 13:43:59 306

原创 15.2 登录 注册

package com.wuciqiu;import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;import java.util.Scanner;class Users{String Name;String pwd;Users(){}Users(String name

2016-06-05 13:39:49 262

原创 15.1 迭代器

迭代器的方法hasNext() 判断是否有元素遍历next()获取元素import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;public class wu{public static void main (String [] args){Collecti

2016-06-05 13:37:20 256

原创 14.7 集合的引入

先来回顾一个知识数组:存储同一张数据类型的集合容器。数组的特点:1、只能存储同一种数量类型的数据。2、一旦初始化,长度固定。3、数组中的饿元素与元素之间的内存地址是连续的。注意:Object类型的数组是可以存储任意类型的数据。集合:集合是存储对象数据的集合容器。1、集合可以存储任意类别的对象数据,数组只能存储一个类别的对象。2、集

2016-05-27 16:05:33 385

原创 14.6 守护线程

守护线程也称为后台进程。isDaemon()是用来判断是不是守护线程怎么才能让线程为守护线程setDaemon(true)//true为是,flase不是。默认线程不是守护线程。join()加入:一个线程如果执行了join语句,那么就有线程加入,执行语句的线程必须要让步给新的线程先完成任务,然后才继续执行。class Son extends Thread{

2016-05-27 16:04:35 268

原创 14.5 wait和notify方法 停止线程

wait()一个线程如果执行了wait方法,那个该线程会进入一个以锁对象为标识符的线程池中等待。等着中会释放资源。notify()如果一个线程开启了notify方法,那么久会唤醒以锁对象为标识符的线程中其中的一个。notifyall()唤醒全部的线程。这个2个方法一定要用锁对象来调用。stop()停止线程//这个已经过时500升水池5进水,2出水

2016-05-27 16:03:18 930

原创 14.4 线程的通讯

线程通讯:一个线程完成自己的任务时,就要通知另外一个线程去例子就是生产者与消费者关系wait():等待。如果线程执行了wait方法,那么该线程会进入等待的状态notify():唤醒等待的线程注意:1、wait和notify方法是属于Objeck类的。2、wait和notify方法必须是要找同步代码块或者同步函数中才能使用。3、wait和notif

2016-05-27 16:02:08 338

原创 14.3 线程的实现方式二练习:买票

class SaleTicke implements Runnable{ int k=10; //注意这里不用静态,因为只创建一个Runable子类的对象 public void run() { while(true) { synchronized("锁") { if(k>0) { System.out.

2016-05-27 16:00:42 304

原创 14.2 线程创建的方式二:

方式一:1、自定义一个类,该类继承Thread类。2、重写Thread类的run方法,把自定义线程的代码放到run方法上。3、创建Thread子类的对象,调用start方法,启动线程。方式二:1、自定义一个类实现Runnable接口。2、实现Runnable接口的run方法,把自定义的线程代码放到run方法中。3、创建runnable的实现类对象。4、创建T

2016-05-27 15:59:31 257

空空如也

空空如也

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

TA关注的人

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