Does it really matter which you use?
According to the WordPress Codex, there is actually a distinct difference between WP_Query() and query_posts(), as for when and where you should use one of the other and when you shouldn't.
Here's what it says:
The query_posts() function is intended to be used to modify the main page Loop only. It is not intended as a means to create secondary Loops on the page.
If you want to create separate Loops outside of the main one, you should create separate WP_Query() objects and use those instead.
Use of query_posts() on Loops other than the main one can result in your main Loop becoming incorrect and possibly displaying things that you were not expecting.
What does that mean?
It isn't entirely clear what the main page loop is, or what the other loops are that WordPress uses. Let me try to explain for those that don't get it.
The Main Page Loop And query_posts
On average, all of the main theme template files, index.php, single.php, page.php, etc., will more than likely contain a piece of code at the beginning that looks something like this:
<?php if ( have_posts() ) : ?> <?php while ( have_posts() ) : the_post(); ?>
Then somewhere further down in the code there is an endwhile;endif; which will end the while loop and the if respectively. That is what makes the main page loop.
You should note that WordPress includes certain settings that can control how the loop is generated, which can potentially interfere with any custom queries which you create.
The "Blog pages show at most" parameter in Settings > Reading can influence your results. To overcome this, add the 'posts_per_page' parameter to your query.
For other ways to use query_posts() here are some examples.
Creating Custom Loops and WP_Query
I will only go over this quickly since I have previously written a tutorial on how to use WP_Query() to create custom loops. So you can refer to that for more information if needed.
If you need to create a custom loop on a page that already has the main loop that I went over above, or in other words a separate loop, you need then use WP_Query() to create a separate wp_query object. The reason this is important is so you don't end up somehow changing or otherwise interfering with the main loop used in that page. Think of WP_Query as an instance, or a copy of the object. To create a loop that should use this object for displaying something different, you need to create a new copy of it so you don't screw up the more important one which most likely generates the main content of that page.
Confused yet? It's a somewhat difficult thing to explain, so if you have any questions about this then please leave a comment and I can better explain anything you are unclear about. All comments are welcome (except spam).